我对在Yii2中创建REST api的简单方式印象深刻。但是,我在理解基本身份验证方面遇到了一些麻烦。我的需求非常简单,我希望我的解决方案能够效仿。
我需要这里的基本令牌身份验证。我现在甚至不反对硬编码,但这是我迄今为止所做的。
我有数据库表来保存我的单数令牌ApiAccess(id,access_token)
ApiAccess.php - 模型 - 注意:IDE在第一行显示语法错误
class ApiAccess extends base\ApiAccessBase implements IdentityInterface
{
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
}
Module.php - 在init()函数
中 \Yii::$app->user->enableSession = false;
我制作了一个ApiController,每个后续名词都延伸
ApiController.php
use yii\rest\ActiveController;
use yii\filters\auth\HttpBasicAuth;
use app\models\db\ApiAccess;
class ApiController extends ActiveController
{
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => HttpBasicAuth::className(),
];
return $behaviors;
}
}
目前,在浏览器中访问api端点会提示输入用户名和密码。通过REST客户端请求显示访问错误。
如何将HttpBasicAuth与我的ApiAccess模型正确绑定?
OR
如何对api访问令牌进行硬编码?(第一个选项显然最好)
答案 0 :(得分:24)
让我们观察并尝试理解" yii"方式REST的基本身份验证。
第一。向REST控制器添加行为时,启用基本身份验证:
$behaviors['authenticator'] = [
'class' => HttpBasicAuth::className(),
];
正如你所做的那样。这是什么意思?这意味着您的应用程序将解析您的授权标头。它看起来像:
Authorization : Basic base64(user:password)
这是yii2的一个技巧。如果您仔细查看代码,您会看到yii使用来自用户字段的access_token
,因此您的标题应如下所示:
Authorization : Basic base64(access_token:)
如果要更改此行为,可以自行解析此标头:
$behaviors['authenticator'] = [
'class' => HttpBasicAuth::className(),
'auth' => [$this, 'auth']
];
....
public function auth($username, $password)
{
return \app\models\User::findOne(['login' => $username, 'password' => $password]);
}
要做的第二件事。您必须从identityInterface实现findIdentityByAccessToken()
函数。
你的IDE为什么抱怨?
class User extends ActiveRecord implements IdentityInterface
以下是您的用户类声明的外观。
从您的实施和结构:
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
你没有返回实现身份接口的类的对象。
如何正确使用?
将列access_token添加到您的users表,并返回您的用户模型(您可以查看它必须在此处查看 - https://github.com/yiisoft/yii2-app-advanced/blob/master/common/models/User.php)
如果您这样做 - 默认代码将与您的findIdentityByAccessToken()
实施一起使用。
如果您不想向用户表添加字段,请使用user_id,access_token
字段创建新字段。然后您的实现应该如下所示:
public static function findIdentityByAccessToken($token, $type = null)
{
$apiUser = ApiAccess::find()
->where(['access_token' => $token])
->one();
return static::findOne(['id' => $apiUser->user_id, 'status' => self::STATUS_ACTIVE]);
}
希望我能涵盖你所有的问题。