gpt4 book ai didi

php - Yii2 REST 简化 BasicAuth

转载 作者:IT王子 更新时间:2023-10-29 00:03:01 27 4
gpt4 key购买 nike

我对在 Yii2 中创建 REST api 的简单程度印象深刻。但是,我在理解基本身份验证时遇到了一些麻烦。我的需求非常简单,我希望我的解决方案能够效仿。

我在这里需要基本 token 身份验证。我现在甚至不反对硬编码,但这是我到目前为止所做的。

我有数据库表来保存我的单一 token 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 绑定(bind)到我的 ApiAccess 模型?

如何硬编码 api 访问 token ?(第一个选项显然是最好的)

最佳答案

让我们观察并尝试理解“yii”方式的 REST 基本身份验证。

第一。当您向 REST Controller 添加行为时,您启用了基本身份验证:

$behaviors['authenticator'] = [
'class' => HttpBasicAuth::className(),
];

正如你所做的那样。这是什么意思?这意味着您的应用程序将解析您的授权 header 。看起来像:

Authorization : Basic base64(user:password)

这是 yii2 的一个技巧。如果您更仔细地查看代码,您会发现 yii 使用用户字段中的 access_token,因此您的 header 应如下所示:

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]);
}

你没有返回实现身份接口(interface)的类的对象。

如何正确制作?将列 access_token 添加到您的用户表,并返回您的用户模型(您可以在此处查看它的外观 - 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]);
}

希望我能回答您所有的问题。

关于php - Yii2 REST 简化 BasicAuth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29567658/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com