PHP平台JWT登录鉴权核心是签发Token与统一校验,替代Session,适用于API和前后端分离;需用firebase/php-jwt库,配置JWT_SECRET、JWT_EXP、JWT_ISS,登录生成含uid/iat/exp/iss的Token,中间件从Authorization头提取并校验,失败返回401,退出由客户端清空Token实现。

PHP平台用JWT实现登录鉴权,核心是“签发Token + 统一校验”,不依赖Session,适合API服务和前后端分离场景。关键不在加密多强,而在流程闭环:用户登录成功后立刻生成Token,后续所有受保护接口都强制验证它。
安装与基础配置
推荐使用官方维护的 firebase/php-jwt 库:
- 执行
composer require firebase/php-jwt:^6.4.0(适配 PHP 7.4;若用 PHP 8.0+,可选 ^6.10.0) - 在配置文件(如
config/jwt.php或.env)中定义安全参数:JWT_SECRET=your_strong_32byte_random_key_hereJWT_EXP=3600(单位秒,建议1小时以内)JWT_ISS=api.example.com(签发者,用于校验一致性) - 密钥绝不能硬编码在代码里,必须从环境变量读取
登录接口生成Token
用户凭证校验通过后,构造Payload并签名:
- Payload至少包含:
uid(用户唯一标识)、iat(签发时间)、exp(过期时间)、iss(签发者) - 避免放入密码、手机号等敏感字段;角色、权限等非敏感扩展信息可加,如
roles: ["user"] - 使用 HS256 算法签名(开发/一般生产够用),示例代码片段:
use Firebase\JWT\Key;
$payload = [
'uid' => $user['id'],
'username' => $user['username'],
'iat' => time(),
'exp' => time() + config('jwt.exp'),
'iss' => config('jwt.iss')
];
$token = JWT::encode($payload, config('jwt.secret'), 'HS256');
中间件统一校验Token
所有需鉴权的路由前,挂载自定义中间件(如 CheckJwtToken):
- 从
Authorization: Bearer xxx头提取Token,先用正则校验格式:/^Bearer\s+(.+)$/ - 调用
JWT::decode()解析,并显式传入算法数组['HS256'] - 必须捕获三类异常:
UnexpectedValueException(token篡改)、InvalidArgumentException(格式错误)、DomainException(密钥加载失败)——不能只 catch JWTException - 校验通过后,把
$token->uid等信息绑定到请求上下文(如think\Request::instance()->userId = $token->uid),供控制器直接使用 - 失败一律返回
401 Unauthorized,不静默放行
退出与失效控制
JWT本身无状态,服务端不存Token,因此“退出”逻辑不同:
- 客户端清空本地存储(localStorage/sessionStorage)即完成退出
- 如需强制使某Token立即失效(如修改密码、异地登录踢出),需引入轻量级黑名单机制:
将待废止的jti(需登录时生成并写入Payload)或uid+iat组合存入 Redis,有效期略长于Token本身;校验时额外查一次黑名单 - 不建议将全部Token存Redis——违背JWT无状态设计初衷
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











