thinkphp8.1集成jwt认证的核心是无状态、可验证、不存服务端,关键三步:安装firebase/php-jwt扩展、封装jwttoken工具类(含签发/解析/异常处理)、编写jwtauth中间件(提取bearer token并注入uid属性),小程序需结合wx.login与code2session实现登录。

ThinkPHP8.1 接口开发集成 JWT 认证,核心是「无状态、可验证、不存服务端」。不需要改框架底层,也不依赖 session,关键在三步:装扩展、写 token 工具类、加校验中间件。
安装 JWT 扩展并配置密钥
运行命令安装官方推荐的库:
composer require firebase/php-jwt
然后在 config/app.php 中添加 jwt 配置段(密钥长度建议 ≥32 字符):
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
'jwt' => [
'key' => 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6A7B8C9D0E1F2',
'expire' => 7200, // 2 小时
'alg' => 'HS256'
],
封装 Token 工具类(推荐放 app/common/JwtToken.php)
这个类负责生成和解析 token,payload 中只放必要字段,避免敏感信息:
- 签发时必设 iat(当前时间)、exp(过期时间),建议用
time() + config('app.jwt.expire') - 可选但推荐设置 iss(如
api.example.com)和 aud(如mini-program),增强校验安全性 - 用户 ID 建议用业务唯一标识(如加密后的 uid),不要直接暴露数据库自增主键
- 解码失败要明确抛出异常,比如
ExpiredException或通用\Exception,便于统一处理
编写 JWT 校验中间件(app/middleware/JwtAuth.php)
中间件用于拦截需鉴权的接口,从请求头提取 Bearer Token 并验证:
- 用
$this->request->header('authorization')获取完整 header,手动截取 Bearer 后面的字符串 - 调用
JwtToken::verifyToken($token)解析 payload,成功后把用户 ID 写入请求属性:$request->withAttr('uid', $data['uid']) - 对登录、注册等免鉴权接口,路由注册时跳过该中间件;其他接口统一加
middleware(JwtAuth::class) - 不要在中间件里查数据库加载用户详情——JWT payload 已含基础字段,业务层按需查
微信小程序适配要点
若对接小程序,登录流程需结合 wx.login 和 code2Session:
- 小程序端调用
wx.login()获取临时 code,传给后端/login接口 - 后端用 code 向微信服务器换取
openid,查库确认用户是否存在,不存在则新建 - 签发 token 时,payload 中可带
openid、nickname等轻量字段,避免后续频繁查库 - 小程序请求携带 token 时,统一放在
Authorization: Bearer xxx头中,后端中间件即可识别
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










