gpt4 book ai didi

api - Yii 2 RESTful API 使用 HTTP Basic 进行身份验证(Yii 2 高级模板)

转载 作者:行者123 更新时间:2023-12-02 06:52:23 24 4
gpt4 key购买 nike

REST API 无需身份验证方法即可工作。现在我想通过移动应用程序使用 HTTP 基本身份验证对 API 请求进行 REST API 身份验证。我尝试使用 yii2 指南,但它对我不起作用。

基本上移动用户需要使用用户名和密码登录,如果用户名和密码正确,用户需要登录,并且进一步的API请求需要使用 token 进行验证。

当我调试 findIdentityByAccessToken() 函数时 $token 等于用户名。Postman 扩展用于检查 HTTP 基本请求。用户表中的access_token字段为空。我需要手动保存吗?如何返回 access_token 作为响应?

是否有任何理由同时使用所有三种方法(HttpBasicAuth、HttpBearerAuth、QueryParamAuth),为什么?如何?

我的应用程序文件夹结构如下所示。

api
-config
-modules
--v1
---controllers
---models
-runtime
-tests
-web

backend
common
console
environments
frontend

api\modules\v1\Module.php

namespace api\modules\v1;
class Module extends \yii\base\Module
{
public $controllerNamespace = 'api\modules\v1\controllers';

public function init()
{
parent::init();
\Yii::$app->user->enableSession = false;
}
}

api\modules\v1\controllers\CountryController.php

namespace api\modules\v1\controllers;
use Yii;
use yii\rest\ActiveController;
use common\models\LoginForm;
use common\models\User;
use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBasicAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;

class CountryController extends ActiveController
{
public $modelClass = 'api\modules\v1\models\Country';

public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => HttpBasicAuth::className(),
//'class' => CompositeAuth::className(),
// 'authMethods' => [
// HttpBasicAuth::className(),
// HttpBearerAuth::className(),
// QueryParamAuth::className(),
// ],
];
return $behaviors;
}

}

common\models\User.php

namespace common\models;

use Yii;
use yii\base\NotSupportedException;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;

class User extends ActiveRecord implements IdentityInterface
{
const STATUS_DELETED = 0;
const STATUS_ACTIVE = 10;

public static function tableName()
{
return '{{%user}}';
}

public function behaviors()
{
return [
TimestampBehavior::className(),
];
}

public function rules()
{
return [
['status', 'default', 'value' => self::STATUS_ACTIVE],
['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]],
];
}

public static function findIdentity($id)
{
return static::findOne(['id' => $id, 'status' => self::STATUS_ACTIVE]);
}

public static function findIdentityByAccessToken($token, $type = null)
{

return static::findOne(['access_token' => $token]);
}


}

用户表

id
username
auth_key
password_hash
password_reset_token
email
status
created_at
access_token

迁移用户表后添加了access_token

最佳答案

您需要在保存用户之前设置 token 。在用户模型中使用此

public function beforeSave($insert)
{
if (parent::beforeSave($insert)) {
if ($this->isNewRecord) {
$this->auth_key = Yii::$app->getSecurity()->generateRandomString();
}
return true;
}
return false;
}

现在每个用户都有一个 auth_key

要返回 auth_key,您需要在 UserController 中添加 actionLogin

public function actionLogin()
{
$post = Yii::$app->request->post();
$model = User::findOne(["email" => $post["email"]]);
if (empty($model)) {
throw new \yii\web\NotFoundHttpException('User not found');
}
if ($model->validatePassword($post["password"])) {
$model->last_login = Yii::$app->formatter->asTimestamp(date_create());
$model->save(false);
return $model; //return whole user model including auth_key or you can just return $model["auth_key"];
} else {
throw new \yii\web\ForbiddenHttpException();
}
}

之后,在每个 API 请求中,您在 header 中发送 auth_key,而不是发送用户名和密码

$ curl -H "Authorization: Basic bd9615e2871c56dddd8b88b576f131f51c20f3bc" API_URL

要检查 auth_key 是否有效,请在 UserController 行为中定义“authenticator”。 (不要忘记从身份验证中排除“创建”、“登录”、“重置密码”)

public function behaviors()
{
return ArrayHelper::merge(
parent::behaviors(), [
'authenticator' => [
'class' => CompositeAuth::className(),
'except' => ['create', 'login', 'resetpassword'],
'authMethods' => [
HttpBasicAuth::className(),
HttpBearerAuth::className(),
QueryParamAuth::className(),
],
],
]
);
}

关于api - Yii 2 RESTful API 使用 HTTP Basic 进行身份验证(Yii 2 高级模板),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29880518/

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