Jos*_*hua 14 php api rest yii yii2
在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]);
}
}
Run Code Online (Sandbox Code Playgroud)
Module.php - 在init()函数中
\Yii::$app->user->enableSession = false;
Run Code Online (Sandbox Code Playgroud)
我制作了一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
目前,访问浏览器中的api端点会提示输入用户名和密码.通过REST客户端请求显示访问错误.
如何正确地将HttpBasicAuth与我的ApiAccess模型联系起来?
要么
如何对api访问令牌进行硬编码? (第一种选择显然是最好的)
ine*_*rsa 27
让我们观察并尝试理解用于REST的"yii"方式基本身份验证.
1.向REST控制器添加行为时,启用基本身份验证:
$behaviors['authenticator'] = [
'class' => HttpBasicAuth::className(),
];
Run Code Online (Sandbox Code Playgroud)
就像你做的那样.这是什么意思?这意味着您的应用程序将解析您的授权标头.看起来像:
Authorization : Basic base64(user:password)
Run Code Online (Sandbox Code Playgroud)
这是yii2的一个技巧.如果你仔细查看代码,你会看到yii使用access_token来自用户字段,所以你的标题应如下所示:
Authorization : Basic base64(access_token:)
Run Code Online (Sandbox Code Playgroud)
如果要更改此行为,可以自己解析此标头:
$behaviors['authenticator'] = [
'class' => HttpBasicAuth::className(),
'auth' => [$this, 'auth']
];
....
public function auth($username, $password)
{
return \app\models\User::findOne(['login' => $username, 'password' => $password]);
}
Run Code Online (Sandbox Code Playgroud)
第二件事要做.您必须findIdentityByAccessToken()从identityInterface 实现函数.你的IDE为什么抱怨?
class User extends ActiveRecord implements IdentityInterface
Run Code Online (Sandbox Code Playgroud)
以下是您的用户类声明的外观.
从您的实现和结构:
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
Run Code Online (Sandbox Code Playgroud)
你没有返回实现身份接口的类的对象.
如何使它正常?将列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]);
}
Run Code Online (Sandbox Code Playgroud)
希望我能涵盖你所有的问题.