HttpBearerAuth是Yii2最常用且推荐的API认证方式,通过CompositeAuth配置启用,自动从Authorization头提取token并调用findIdentityByAccessToken()验证,要求用户模型实现该方法查access_token字段并校验过期时间,失败返回null触发401。

HttpBearerAuth 是 Yii2 里最常用、也最推荐的 API 认证方式,它不依赖 session,自动从 Authorization 请求头提取 token,并交由你定义的 findIdentityByAccessToken() 处理。自己手动读 $_SERVER['HTTP_AUTHORIZATION'] 或拼接 header 字符串,不仅重复造轮子,还会绕过整个认证链——权限检查、日志记录、行为钩子全失效。
怎么配置 HttpBearerAuth
直接在控制器的 behaviors() 里启用,别写死在 action 里:
- 用
CompositeAuth包一层,方便以后加HttpBasicAuth或QueryParamAuth -
authMethods数组里只放你需要的,比如只用 Bearer 就写[HttpBearerAuth::className()] - 确保
user组件的identityClass已正确指向你的用户模型(如app\models\User)
示例:
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => \yii\filters\auth\CompositeAuth::className(),
'authMethods' => [
\yii\filters\auth\HttpBearerAuth::className(),
],
];
return $behaviors;
}
用户模型必须实现 findIdentityByAccessToken()
这个方法是 HttpBearerAuth 调用的入口,框架拿到 token 后会传进来,你得查数据库返回对应用户对象:
- token 存在
user表的access_token字段里(不是auth_key) - 记得检查
expire_at字段是否过期,过期就返回null - 别在方法里 throw 异常——返回
null就代表认证失败,框架会自动返回 401
示例(简化版):
public static function findIdentityByAccessToken($token, $type = null)
{
$user = static::findOne(['access_token' => $token]);
if ($user && $user->expire_at && $user->expire_at < time()) {
return null;
}
return $user;
}
客户端怎么发 Bearer Token
必须走 HTTPS,明文 HTTP 下 token 会被中间人截获。请求头格式严格为:
Authorization: Bearer xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
- 开头是
Bearer(注意首字母大写,后面跟一个空格) - token 值不能 URL 编码,不能加引号,不能换行
- curl 示例:
curl -H "Authorization: Bearer abc123" https://api.example.com/v1/profile - 浏览器 fetch 示例:
headers: { Authorization: 'Bearer ' + token }
为什么不用 HttpBasicAuth 发 token
虽然也能用,但 HttpBasicAuth 把 token 当作用户名塞进 Authorization: Basic base64(token:),问题很实际:
- 多数 Web 服务器(Nginx/Apache)默认把 Basic Auth 的原始值记进 access log,token 直接裸奔
- PHP-FPM 环境下,
$_SERVER['PHP_AUTH_USER']可能被覆盖或丢失 - 无法携带过期时间、作用域等元信息,扩展性差
- 和 OAuth2 生态不兼容,后续升级成本高
除非你明确控制客户端和服务端日志策略,否则别用 HttpBasicAuth 传 token。
access_token 字段会成为性能瓶颈。上线前记得给这个字段加唯一索引。


















