Yii小程序后端鉴权核心是用微信code2Session获取openid并结合JWT Token替代Cookie/Session/CSRF:先禁用cookie与CSRF验证,再实现登录接口签发Token,接着通过HttpBearerAuth统一校验Token并绑定用户身份,最后配置Cors支持跨域与预检请求。

Yii 开发小程序后端接口鉴权,核心是绕过传统 Web 的 Cookie+Session+CSRF 模式,转而依赖微信 code2Session 返回的 openid 与自定义 Token(如 JWT)组合完成身份识别和会话维持。不对接微信登录态,所有接口都会因无合法用户上下文而拒绝访问。
第一步:禁用 Yii 默认的会话与 CSRF 验证
小程序请求不携带 Cookie,也不发送 X-CSRF-Token,若保留默认配置,所有 POST/PUT/DELETE 请求将直接返回 400 或 403。
- 在
config/web.php的request组件中关闭两项验证:
‘enableCookieValidation’ => false,
‘enableCsrfValidation’ => false,
‘parsers’ => [‘application/json’ => ‘yii\web\JsonParser’],
],
- 控制器中也需显式关闭(尤其继承自
ActiveController时):
{
parent::init();
$this->enableCsrfValidation = false;
}
第二步:实现 code2Session 登录并生成 Token
前端调用 wx.login() 获取 code,POST 到后端 /auth/login 接口。后端需:
- 向微信接口
https://api.weixin.qq.com/sns/jscode2session提交appid、secret和code - 解析返回的
openid(唯一标识)、session_key(后续解密敏感数据用) - 查库确认该
openid是否已存在;不存在则自动创建用户记录 - 签发短期有效的 access_token(如 JWT),payload 中至少包含
openid和时间戳
示例返回:
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"expires_in": 1800,
"user_id": 123,
"openid": "oZQmF5xxxxxxxxxxxxxx"
}
第三步:统一 Token 解析与用户鉴权行为
所有需登录的接口(如 /api/user/profile)应挂载自定义鉴权行为,从请求头 Authorization: Bearer xxx 中提取并校验 Token:
- 使用
yii\filters\auth\HttpBearerAuth基础类,重写authenticate()方法 - 校验 JWT 签名、有效期,并根据
openid查询用户模型(User::findByOpenid($openid)) - 校验通过后,将用户对象赋给
Yii::$app->user->identity,后续可用Yii::$app->user->id或Yii::$app->user->identity->openid
在控制器中启用:
public function behaviors(){
return array_merge(parent::behaviors(), [
‘authenticator’ => [
‘class’ => HttpBearerAuth::class,
],
]);
}
第四步:处理跨域与请求头兼容性
小程序真机调试对响应头极为敏感,必须支持 OPTIONS 预检、携带 Authorization 头,并允许指定域名:
- 在
behaviors()中添加Cors行为,明确放行Authorization和自定义头 - 确保
Access-Control-Allow-Origin不设为*(微信要求精确匹配或白名单) - 对预检请求(OPTIONS),直接返回 200,不走后续鉴权逻辑
‘class’ => \yii\filters\Cors::class,
‘cors’ => [
‘Origin’ => [‘https://your-miniprogram-domain.com’],
‘Access-Control-Request-Headers’ => [‘*’],
‘Access-Control-Allow-Headers’ => [‘Authorization’, ‘Content-Type’],
‘Access-Control-Request-Method’ => [‘GET’, ‘POST’, ‘PUT’, ‘DELETE’, ‘OPTIONS’],
],
],


















