Yii2 REST简化了BasicAuth

时间:2015-04-10 17:46:46

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

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访问令牌进行硬编码?(第一个选项显然最好)

1 个答案:

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

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