php – Yii2 REST简化BasicAuth

前端之家收集整理的这篇文章主要介绍了php – Yii2 REST简化BasicAuth前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我对在Yii2中创建REST api的简单程度印象深刻.但是,我对基本身份验证有一点麻烦.我的需求是非常简单的,我想要我的解决方案.

我需要基本的令牌认证.现在我甚至没有对它进行硬编码,但是这是我迄今为止所做的.

我有数据库表来保存我的单个令牌ApiAccess(id,access_token)

ApiAccess.PHP – 模型 – 注意:IDE在此第一行显示语法错误

  1. class ApiAccess extends base\ApiAccessBase implements IdentityInterface
  2. {
  3. public static function findIdentityByAccessToken($token,$type = null)
  4. {
  5. return static::findOne(['access_token' => $token]);
  6. }
  7. }

module.PHP – 在init()函数

  1. \Yii::$app->user->enableSession = false;

我做了一个ApiController,每个后续的名词扩展

ApiController.PHP

  1. use yii\rest\ActiveController;
  2. use yii\filters\auth\HttpBasicAuth;
  3. use app\models\db\ApiAccess;
  4.  
  5. class ApiController extends ActiveController
  6. {
  7. public function behaviors()
  8. {
  9. $behaviors = parent::behaviors();
  10. $behaviors['authenticator'] = [
  11. 'class' => HttpBasicAuth::className(),];
  12. return $behaviors;
  13. }
  14. }

就这样,访问浏览器中的api端点会提示输入用户名和密码.通过REST客户端请求显示访问错误.

如何正确地将HttpBasicAuth绑定到我的ApiAccess模型?

要么

如何硬编码api访问令牌? (第一选择显然是最好的)

让我们来看看,并尝试了解“yii”方式REST的基本身份验证.

1.当您向REST控制器添加行为时,启用基本身份验证:

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

和你一样这是什么意思?这意味着您的应用程序将解析您的授权头.看起来像:

  1. Authorization : Basic base64(user:password)

这是yii2的伎俩.如果你仔细看代码,你会看到yii使用user_token,所以你的标题应该是:

  1. Authorization : Basic base64(access_token:)

如果要更改此行为,您可以自己解析此标题

  1. $behaviors['authenticator'] = [
  2. 'class' => HttpBasicAuth::className(),'auth' => [$this,'auth']
  3. ];
  4. ....
  5. public function auth($username,$password)
  6. {
  7. return \app\models\User::findOne(['login' => $username,'password' => $password]);
  8. }

第二件事要做您必须从identityInterface实现findIdentityByAccessToken()函数.
为什么你的IDE抱怨?

  1. class User extends ActiveRecord implements IdentityInterface

以下是您的用户类声明应该如何看待.

从您的实施和结构:

  1. public static function findIdentityByAccessToken($token,$type = null)
  2. {
  3. return static::findOne(['access_token' => $token]);
  4. }

你不返回实现标识接口的类的对象.

如何正确使用?
将列access_token添加用户表中,并返回您的用户模型(您可以看看它必须如何看 – https://github.com/yiisoft/yii2-app-advanced/blob/master/common/models/User.php)
如果这样做 – 默认代码将与您的findIdentityByAccessToken()实现一起使用.

如果您不想向用户添加字段表 – 使用user_id,access_token字段创建新字段.那么你的实现应该是:

  1. public static function findIdentityByAccessToken($token,$type = null)
  2. {
  3. $apiUser = ApiAccess::find()
  4. ->where(['access_token' => $token])
  5. ->one();
  6. return static::findOne(['id' => $apiUser->user_id,'status' => self::STATUS_ACTIVE]);
  7. }

希望能覆盖你的所有问题.

猜你在找的PHP相关文章