Yii2 REST简化了BasicAuth

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)

希望我能涵盖你所有的问题.