使用Yii2 REST API的QueryParamAuth时遇401未授权错误及参数问题
Yii2 QueryParamAuth 401未授权问题排查方案
错误信息
"data": {
"name": "Unauthorized",
"message": "Your request was made with invalid credentials.",
"code": 0,
"status": 401,
"type": "yii\web\UnauthorizedHttpException"
}
当前配置
$behaviors['authenticator'] = [ 'class' => QueryParamAuth::class, 'tokenParam' => 'access-token', ];
排查步骤
- 确认请求参数传递正确:检查请求中是否携带了
access-token参数,参数名要和配置里的tokenParam完全一致,注意大小写(Yii2默认区分大小写)。GET请求需在URL后拼接?access-token=你的令牌值,POST请求要在表单或Query参数中带上该字段。 - 验证令牌有效性:确保使用的令牌在存储介质(如数据库用户表)中存在,且未过期、未被标记无效。核对用户表(默认
user表)的access_token字段值与你传递的令牌是否完全一致,避免空格或特殊字符转义问题。 - 检查用户模型实现:用户模型必须实现
yii\web\IdentityInterface接口,且正确重写findIdentityByAccessToken()方法,确保能根据传入的令牌返回对应用户实例。示例实现:
public static function findIdentityByAccessToken($token, $type = null) { return static::findOne(['access_token' => $token]); }
若令牌存储逻辑不同(如单独的令牌表),需调整该方法的查询逻辑以匹配你的存储规则。
- 排除权限控制干扰:若控制器同时配置了
AccessControl行为,检查其rules规则是否允许已认证用户访问目标接口,避免额外权限规则拦截请求。 - 确认请求参数位置:QueryParamAuth默认从Query参数中读取令牌,若使用POST JSON请求,需确保Yii2已配置JSON解析器,且令牌参数名正确出现在JSON请求体中。
- 验证令牌生成逻辑:检查生成
access-token的代码,确保令牌正确保存到用户记录中,无生成或保存失败情况。示例生成逻辑:
$user->access_token = Yii::$app->security->generateRandomString(); $user->save(false); // 根据实际场景处理验证与保存逻辑
内容的提问来源于stack exchange,提问作者Gnoul
相关产品推荐
相关产品推荐

