2015-11-03 87 views
1

我yii2新的,我想在登录用户使用REST API,但不能干这事已经设置基本的REST API从这个博客:如何登录使用REST API用户yii2

budiirawan.com/设置的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, 
]; 

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

回答

4

Yii 2.0 REST Authentication docs

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

而且从this other docs有关用户类实现警予\网络\ IdentityInterface

如果你的应用是一个纯粹的无状态的RESTful应用程序,你会 只需要实现findIdentityByAccessToken( )和getId(),而 将所有其他方法留空。


问题的REST约为路由。如果遵循基于令牌的认证,那么如果发送给服务器的请求持有有效的令牌,则它应返回资源收集。否则它应该被拒绝。在这种情况下

登录过程,是一个请求拿着用户名/密码对将与一个有效的令牌由服务器进行交换,即令牌你要与你的下一个所有的请求,包括。

如果会议是为Yii的文档(见上链接)中描述的设置enableSessionfalse在服务器端禁用和推荐的无国籍自然的休息,然后\Yii::$app->user->isGuest不应该提供的信息为你服务器将不会有任何会话来获取它。 (除非验证令牌的有效性,而不是检查会话

当建立一个类扩展yii\rest\ActiveController你无法呈现一个HTML页面,如:

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

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

return $this->goHome(); 

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

详情请参阅Yii RESTful API framework documentations。那么你会发现在这个伟大的教程有用的信息如何实现Yii2 Rest认证

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

+0

我试图给出解决方案,一旦完成将会让你知道。 :) – Arunendra