如何在yii2中使用rest api登录用户

Aru*_*dra 1 api rest yii2

我是 yii2 的新用户,我希望使用 REST API 登录用户,但无法做到这一点。我已经从这个博客设置了基本的 REST API:

budiirawan.com/setup-restful-api-yii2/

之后我创建了:

api\modules\v1\controllers\SiteController.php

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

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use common\models\LoginForm;
use yii\filters\VerbFilter;
use yii\rest\ActiveController;
/**
 * Site controller
 */
class SiteController extends ActiveController
{
    /**
     * @inheritdoc
     */
    public $modelClass = 'api\modules\v1\models\user';    


    public function actionIndex()
    {
            if (!\Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) {
            return $this->goBack();
        } else {
            return $this->render('login', [
                'model' => $model,
            ]);
        }
    }

    public function actionLogout()
    {
        Yii::$app->user->logout();

        return $this->goHome();
    }
}
Run Code Online (Sandbox Code Playgroud)

并创建了模型

RtWorkForce\api\modules\v1\models\User.php

<?php
namespace api\modules\v1\models;
use \yii\db\ActiveRecord;

/**
 * User Model
 *
 */
class User extends ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return '{{%user}}';

    }


}
Run Code Online (Sandbox Code Playgroud)

这是我的 main.php

<?php

$params = array_merge(
    require(__DIR__ . '/../../common/config/params.php'),
    require(__DIR__ . '/../../common/config/params-local.php'),
    require(__DIR__ . '/params.php'),
    require(__DIR__ . '/params-local.php')
);

return [
    'id' => 'app-api',
    'basePath' => dirname(__DIR__),    
    'bootstrap' => ['log'],
    'modules' => [
        'v1' => [
            'basePath' => '@app/modules/v1',
            'class' => 'api\modules\v1\Module'
        ]
    ],
    'components' => [ 
                'request' => [
                    'parsers' => [
                        'application/json' => 'yii\web\JsonParser',
                    ]
                ],  
        'user' => [
            'identityClass' => 'common\models\User',
            'enableAutoLogin' => false,
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => 'yii\rest\UrlRule', 
                    'controller' => ['v1/country','v1/user','v1/site'],
                    'tokens' => [
                        '{id}' => '<id:\\w+>'
                    ]

                ]
            ],        
        ]
    ],
    'params' => $params,
];
Run Code Online (Sandbox Code Playgroud)

但它不起作用我不知道我错在哪里?

Sal*_*ani 5

来自Yii 2.0 REST 身份验证文档

与 Web 应用程序不同,RESTful API 通常是无状态的,这意味着不应使用会话或 cookie。

并从有关实现yii\web\IdentityInterface的用户类的其他文档中:

如果您的应用程序是纯无状态 RESTful 应用程序,则只需实现 findIdentityByAccessToken() 和 getId(),同时将所有其他方法保留为空主体。


RESTfull 是关于路由的。如果遵循基于令牌的身份验证,那么,如果发送到服务器的请求持有有效令牌,它应该返回资源集合。否则应该被拒绝。

在这种情况下,登录过程是一个包含用户名/密码对的请求,该请求将由服务器与有效令牌进行交换,即您将在所有下一个请求中包含的令牌。

如果通过设置为在服务器端禁用会话,如 Yii 文档中所述(请参阅上面的链接)以及REST无状态性质所建议的那样,则不应提供信息,因为您的服务器将没有任何会话可从中获取信息。(除非它验证令牌有效性而不是检查会话enableSessionfalse\Yii::$app->user->isGuest

当构建扩展yii\rest\ActiveController 的类时,您无法呈现如下 html 页面:

return $this->render('login', [
    'model' => $model,
]);
Run Code Online (Sandbox Code Playgroud)

或重定向到不同的 HTML 页面,例如:

return $this->goHome();
Run Code Online (Sandbox Code Playgroud)

在构建基于 HTML 的 Web 应用程序时,这将与yii\base\Controller一起使用,而不是yii\rest\ActiveController。使用 ActiveController,您只需返回数据,该数据将在输出之前序列化为jsonxml

请参阅Yii RESTful API 框架文档以获取更多详细信息。那么您可能会在这个关于如何实现 Yii2 REST 身份验证的精彩教程中找到有用的信息:

http://blog.neattutorials.com/angularjs-and-yii2-part-2-authentication/