ThinkPHP8微信小程序后端JWT认证实战【移动】

风辰君_1039

风辰君_1039

2026-08-08

996人浏览

原创

thinkphp8微信小程序jwt认证需解决登录态持久化、token安全透传、无状态鉴权与用户上下文注入四大问题,必须弃用session改用jwt,安装firebase/php-jwt:^6.4.0并配置.env密钥,禁用none算法,校验class_exists('firebasejwtjwt')确保加载成功。

thinkphp8微信小程序后端jwt认证实战【移动】

ThinkPHP8微信小程序后端JWT认证实战【移动】需解决小程序登录态持久化、token安全透传、无状态鉴权与用户上下文注入四大问题,不能直接复用Web端Session逻辑,否则每次请求都查库、无法支持多端并发、退出后token仍有效。

安装适配PHP 8.1+的JWT库

执行composer require firebase/php-jwt:^6.4.0——v6.4.0是当前唯一稳定兼容PHP 8.1且规避none算法漏洞的版本;v7.x要求PHP ≥8.2,与多数小程序生产环境(PHP 8.0–8.1)不匹配。

安装后立即验证:php -r "var_dump(class_exists('Firebase\JWT\JWT'));"输出bool(true)即成功。

若报错Class 'FirebaseJWTJWT' not found,请确认composer autoload已生效,不要手动require_once。

配置密钥与UTC时区

在config/jwt.php中写入:

return ['secret' => env('JWT_SECRET', 'dev_default_key_2026')];

【JWT_SECRET必须写入.env且禁止提交到Git】——开发可用openssl rand -base64 32生成,生产环境密钥须由运维统一分发并轮换。

打开public/index.php,在下方第一行插入:date_default_timezone_set('UTC');——【缺失此行会导致exp校验必然失败】,因小程序前端时间戳按UTC生成,PHP若用本地时区解析会偏差数小时。

封装JwtService生成带小程序字段的Token

新建app/common/service/JwtService.php,命名空间为appcommonservice。

在generateToken()方法中,payload必须包含微信小程序特有字段:

$payload = [
'uid' => $user['id'],
'openid' => $user['wx_openid'], // 小程序唯一标识,用于后续消息推送
'unionid' => $user['wx_unionid'] ?: null, // 多平台打通必需
'iat' => time(),
'exp' => time() + 7200, // 2小时有效期,兼顾安全性与体验
'jti' => uniqid('', true), // 防重放攻击
];

调用FirebaseJWTJWT::encode($payload, config('jwt.secret'), 'HS256')生成token——严禁拼接base64字符串或手动构造header,全部交由官方库处理。

编写JwtAuth中间件拦截并注入用户

执行php think make:middleware JwtAuth创建中间件。

在handle()方法内按顺序执行:

企业微信智能办公助手
企业微信智能办公助手

企业微信智能助手,自动汇总日程、会议、待办及团队数据,生成可视化早报。

下载

① 提取Authorization头:$auth = $request->header('authorization');注意ThinkPHP内部统一转小写,必须用'authorization',不能写'Authorization'或'Bearer'。

② 正则提取token:preg_match('/Bearers+(.+)/i', $auth, $m) ? $token = $m[1] : $token = null;——【不能用explode(' ', $auth)[1],空格可能在前后导致越界】。

③ 解析并校验:$decoded = FirebaseJWTJWT::decode($token, new FirebaseJWTKey(config('jwt.secret'), 'HS256'), ['HS256']);——【必须显式传入算法数组['HS256'],防止none算法攻击】。

④ 手动双重校验过期与签发时间:if (!isset($decoded->exp) || !isset($decoded->iat) || $decoded->exp

⑤ 注入用户上下文:$request = $request->withAttribute('jwtUser', $decoded);后续控制器可通过$this->request->getAttribute('jwtUser')直接读取openid等字段。

配置Nginx透传Authorization头

小程序前端通过wx.request({ header: { 'Authorization': 'Bearer xxx' } })发送token,但Nginx默认过滤Authorization头。

在Nginx站点配置的location块内添加:

proxy_set_header Authorization $http_authorization;

若使用HTTPS反向代理,还需加:proxy_pass_request_headers on;

配置完执行nginx -t && nginx -s reload,否则中间件永远收不到token。

路由分组绑定中间件并排除登录接口

在app/route/app.php中定义API分组:

Route::group(['middleware' => 'jwt.auth'], function () {
Route::get('user/info', 'User/info');
Route::post('order/create', 'Order/create');
})->except(['login', 'refresh', 'captcha']);

->except()参数必须显式列出无需鉴权的接口,【漏写login将导致小程序首次登录失败】。

登录接口返回token后,小程序端应立即调用wx.setStorageSync('token', res.data.token)持久化存储。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2223

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5890

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5206

10

php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

9764

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

5841

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2055

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

3648

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4334

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3391

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习