我是 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)
但它不起作用我不知道我错在哪里?
与 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,您只需返回数据,该数据将在输出之前序列化为json或xml。
请参阅Yii RESTful API 框架文档以获取更多详细信息。那么您可能会在这个关于如何实现 Yii2 REST 身份验证的精彩教程中找到有用的信息:
http://blog.neattutorials.com/angularjs-and-yii2-part-2-authentication/
| 归档时间: |
|
| 查看次数: |
13149 次 |
| 最近记录: |