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

时间:2015-11-03 13:25:31

标签: api rest yii2

我是yii2中的新用户,我希望登录用户使用rest api但无法执行此操作。我已从此博客设置基本REST API:

  

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

之后我创建了:

  

API \模块\ V1 \控制器\ 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();
    }
}

创建模型

  

RtWorkForce \ API \模块\ V1 \模型\ 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}}';

    }


}

这是我的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,
];

但是,我不工作,我不知道我错在哪里?

1 个答案:

答案 0 :(得分:4)

来自Yii 2.0 REST Authentication docs

  

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

关于实施 yii \ web \ IdentityInterface 用户类的this other docs

  

如果您的应用程序是纯粹的无状态RESTful应用程序,那么您会这样做   只需要实现findIdentityByAccessToken()和getId()   将所有其他方法留空。

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

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

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

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

return $this->render('login', [
    'model' => $model,
]);

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

return $this->goHome();

在构建基于HTML的网络应用而非yii\base\Controller时,这将适用于yii\rest\ActiveController。使用ActiveController,您只需返回在输出之前将序列化为 json xml 的数据。

有关详细信息,请参阅Yii RESTful API framework documentations。然后,您可以在这个关于如何实现Yii2 REST身份验证的精彩教程中找到有用的信息:

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