Yii2中构建REST API并集成OAuth2鉴权需三步:先用ActiveController搭建无状态REST接口骨架,再通过filsh/yii2-oauth2-server扩展实现令牌发放,最后在控制器中配置OAuth2Filter行为校验Bearer Token,全程禁用session、依赖标准协议与JWT自动验证。

在 Yii2 中构建 REST API 并集成 OAuth2 鉴权,核心是分三步走:先搭好无状态的 REST 接口骨架,再引入 OAuth2 服务提供令牌发放能力,最后让 API 接口实际校验令牌。整个流程不依赖 session,强调每个请求自带凭证,符合现代 API 安全实践。
一、快速搭建 Yii2 RESTful API 基础结构
使用 ActiveController 可以分钟级暴露模型为标准 REST 资源接口:
- 定义模型(如
User),继承ActiveRecord,配置数据库表名与验证规则 - 创建控制器(如
UserController),继承\yii\rest\ActiveController,设置$modelClass指向模型类 - 在
config/web.php的urlManager中添加规则:['class' => 'yii\rest\UrlRule', 'controller' => 'user'] - 启用内容协商器,强制返回 JSON:
在控制器behaviors()中配置ContentNegotiator,将text/html映射为Response::FORMAT_JSON
完成后,GET /users、POST /users 等标准路由即自动可用。
二、集成 filsh/yii2-oauth2-server 实现授权服务
该扩展封装了 OAuth2 核心逻辑,适配 Yii2 生命周期,推荐用于自建授权服务器场景:
- 通过 Composer 安装:
composer require filsh/yii2-oauth2-server - 在
api/config/main.php的modules中注册模块:
指定user_credentials存储映射到你的用户模型(需实现OAuth2\Storage\UserCredentialsInterface) - 运行迁移命令生成 OAuth2 所需数据表:
./yii migrate --migrationPath=@vendor/filsh/yii2-oauth2-server/src/migrations - 配置 URL 规则,使
POST oauth2/token路由指向 token 发放端点 - 用户模型中必须实现两个方法:
checkUserCredentials($username, $password)和getUserDetails($username),用于密码模式校验
三、在 REST 接口中启用 OAuth2 认证拦截
Yii2 不直接在控制器里写鉴权逻辑,而是通过行为(behavior)统一注入:
- 禁用默认的 session 用户组件:在
config/main.php中设'enableSession' => false,避免混淆 - 在需要保护的控制器(如
UserController)的behaviors()方法中,覆盖authenticator行为:
使用\filsh\yii2\oauth2server\filters\OAuth2Filter替代默认的HttpBearerAuth - 确保请求头携带
Authorization: Bearer xxxxxx,框架会自动解析并验证 token 有效性、scope 权限及过期时间 - 若需区分接口权限(如只读 vs 读写),可在 OAuth2 配置中定义不同
scope,并在控制器中通过$this->module->getServer()->getScopeParam()获取并校验
四、补充说明:JWT 与 OAuth2 的关系处理
OAuth2 是授权框架,JWT 是一种常用 token 格式。filsh 扩展默认生成的是 JWT 类型的 access_token,但你无需手动解析它:
- token 签名验证、过期检查、scope 校验均由扩展内部完成
- 如需在业务逻辑中获取用户 ID 或角色,可通过
\Yii::$app->user->id直接访问(前提是user组件已正确配置为基于 OAuth2 的 IdentityInterface 实现) - 不建议自行用
lcobucci/jwt解析 token —— 这会绕过 OAuth2 的 scope 控制和刷新机制,破坏整体安全模型
整个流程从用户登录获取 token,到后续每次请求携带 token 访问资源,全部由标准协议驱动,无需定制协议或私有加密逻辑。


















