Веб-приложение Yii2 продолжает отправлять html-страницу входа в качестве ответа при попытке опубликовать вход через API - PullRequest
0 голосов
/ 20 апреля 2019

Я создаю аутентификацию (логин пользователя) для существующего приложения Yii2 с помощью API-интерфейса rest, использующего responsejs в качестве внешнего интерфейса. Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я отправляю почтовый запрос (localhost: 8080 / v1 / users / login) в API, он всегда возвращается в ответ на страницу входа администратора (html), которая была реализована только с yii2.

Я попытался отправить запрос с помощью почтальона, он по-прежнему возвращает только страницу входа html. Здесь мой модуль Контроллер и Модели Код

файл конфигурации web.php

<?php

$params = require(__DIR__ . '/params.php');

$config = [
    'id' => '****',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
//I added the api module here
    'modules' => [
        'v1' => [
            'class' => 'app\modules\v1\Module'
        ],
        'debug' => 'yii\debug\Module',
    ],

    'components' => [

         'urlManager' => [
            'class' => 'yii\web\UrlManager',
            'showScriptName' => false,
            'enablePrettyUrl' => true,
            'rules' => [
                    [
                        'class' => 'yii\rest\UrlRule', 
                        'controller' => 'v1/user',
                        'except' => ['delete']
                    ],
                    'dashboard'=>'site/index',
                    'login'=>'site/login',
                    'branch/login'=>'branch/default/login',
                    'branch/dashboard'=>'branch/default/index',
                    'drivercorner/login'=>'drivercorner/default/login',
                    'drivercorner/dashboard'=>'drivercorner/default/index',
                    'company/login'=>'company/default/login',
                    'company/dashboard'=>'company/default/index',
                    'company/Driver'=>'company/memberdriver',
                    'company/AddDriver'=>'company/memberdriver/create',
                    'company/DriverDevices'=>'company/memberdevices',
                    'company/Vehicle'=>'company/membercar',
                    'company/driver/<action:\w+>/<id:\d+>'=>'company/driver/<action>',
                    'branch/driver/<action:\w+>/<id:\d+>'=>'branch/driver/<action>',
                    '<controller:\w+>/<id:\d+>' => '<controller>/view',
                    '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
                    '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
            ],
        ],
        'response' => [
            'formatters' => [
                \yii\web\Response::FORMAT_JSON => [
                'class' => 'yii\web\JsonResponseFormatter',
                'prettyPrint' => YII_DEBUG, // use "pretty" output in debug mode
                'encodeOptions' => JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE,
                ],
            ],
        ],
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => 'XwuLqf1zydUHdhd868tljcH7cqnxtvb9',
        'parsers' => [
            'application/json' => 'yii\web\JsonParser',
            ]
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [

            'identityClass' => 'app\models\AdminUser',
            'enableAutoLogin' => false,
        ],
        'jwt' => [
            'class' => 'sizeg\jwt\Jwt',
            'key' => $params['TokenEncryptionKey'],
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],

        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => require(__DIR__ . '/db.php'),
    ],
    'params' => $params,
];

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
    ];

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
    ];
}

return $config;



Фрагмент UserController.php

<?php
    namespace app\modules\v1\controllers;

    use Yii;
    use yii\filters\AccessControl;
    use app\modules\v1\models\User;
    use yii\web\NotFoundHttpException;
    use yii\filters\VerbFilter;
    use yii\web\UploadedFile;
    use yii\web\Response;
    use yii\rest\ActiveController;


    /**
     * UserController implements the CRUD actions for User model.
     */
    class UserController extends ActiveController
    {

        public $modelClass = 'app\modules\v1\models\User';


      public function behaviors()
        {
            $behaviors = parent::behaviors();

            // add CORS filter
            $behaviors['corsFilter'] = [
                'class' => \yii\filters\Cors::className(),
            ];

            $behaviors['authenticator'] = [
                'class' => JwtHttpBearerAuth::className(),
            ];

            $behaviors['authenticator']['except'] = ['login', 'signup'];

            return $behaviors;
        }
        public function beforeAction($action)
        {
            Yii::$app->response->format = Response::FORMAT_JSON;
            return true;
        }

        public function actionLogin()
        {
            // here you can put some credentials validation logic
            //so if it success we return token

            $email = \Yii::$app->getRequest()->post('email', '');
            $password = \Yii::$app->getRequest()->post('password', '');

            $user = null;

            if($email && $password){
                $user = User::findOne(['vEmail' => $email]);
            }

            if($user && $user->validatePassword(password) ){
                $signer = new \Lcobucci\JWT\Signer\Hmac\sha256();
                $expire = time() + \Yii::$app->params['JwtExpire'];
                $jwt = \Yii::$app->jwt;
                $token = $jwt->getBuilder()
                                ->setId(\Yii::$app->params['TokenID'], true)// Configures the id (jti claim), replicating as a header item
                                ->setIssuedAt(time())// Configures the time that the token was issue (iat claim)
                                ->setExpiration($expire)// Configures the expiration time of the token (exp claim)
                                ->set('uid', $user->id)// Configures a new claim, called "uid"
                                ->sign($signer, $jwt->key)// creates a signature using [[Jwt::$key]]
                                ->getToken(); // Retrieves the generated token

                    return $this->asJson([
                            'token' => (string)$token,
                    ]);
            }
            \Yii::$app->response->statusCode = 401;
                return ['msg' => 'username/password is wrong!'];

        }
        public function actionData()
        {
            return $this->asJson([
                'success' => true,
            ]);
        }
        public function actionView($id)
        {
            return User::findOne($id);
        }


    }

Модель User.php


namespace app\modules\v1\models;

use Yii;
use yii\helpers\Html;
use yii\grid\GridView;
use yii\helpers\ArrayHelper;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;

/**
 * This is the model class for table "user".
 *
 * @property int $iUserId
 * @property string $vFacebookId
 * @property string $vInstagramId
 * @property string $vTwitterId
 * @property string $vFirstName
 * @property string $vLastName
 * @property string $vNickName
 * @property string $vEmail

 */

class User extends ActiveRecord implements IdentityInterface
{
    /**
     * @inheritdoc
     */
    public $social_id,$eLoginWith,$eUserType,$eDeviceType,
    $vDeviceName,$vDeviceToken,$vAppVersion,$vDeviceId,$start_date,$end_date;
    public static function tableName()
    {
        return 'user';
    }


public static function findIdentityByAccessToken($token, $type = null)
    {

        $signer = new Sha256();
        $decoded_token = (new Parser())->parse((string)$token); // Parses from a string
        $data = new ValidationData(); // It will use the current time to validate (iat, nbf and exp)
        $data->setId(Yii::$app->params['TokenID']);
        if ($decoded_token->verify($signer, Yii::$app->params['TokenEncryptionKey'])) {
            if ($decoded_token->validate($data)) {
                $user = User::findOne(['$iUserId' => $decoded_token->getClaim('uid')]);
                if ($user) {
                    return $user;
                } else {
                    return null;
                }
            }

        }

    }

    /**
     * Validates password.
     *
     * @param  string $password
     * @return bool
     */
    public function validatePassword($password)
    {
        return Yii::$app->security->validatePassword($password, $this->vPassword);
    }   
}

Я хочу получить ответ с ошибкой кода при прохождении неверного маршрута или неверных параметров.

...