在ThinkPHP中实现JWT认证需通过签发、携带和验证token完成无状态登录。首先安装firebase/php-jwt库,用户登录成功后生成包含uid、username等信息的JWT token,并设置过期时间,返回给前端存储并随请求放入Authorization头。服务端通过中间件或基础控制器解析Bearer token,使用密钥验证签名有效性,获取用户身份信息。建议将密钥配置在文件中,避免硬编码,合理设置过期时间并结合Redis实现黑名单或刷新机制,敏感数据不存入payload,全程启用HTTPS保障传输安全。该方案支持跨域与分布式部署,提升系统扩展性。

在 ThinkPHP 中实现 JWT(JSON Web Token)用户认证和无状态登录,核心是使用 JWT 代替传统的 Session 认证机制。整个流程不依赖服务器端存储会话信息,适合分布式或 API 场景。
JWT 基本原理
JWT 是一种基于 JSON 的开放标准(RFC 7519),用于在各方之间安全传输信息。它由三部分组成:Header、Payload 和 Signature。服务端签发 token 后,客户端后续请求携带该 token 进行身份验证。
优势包括:
安装 JWT 扩展库
推荐使用 firebase/php-jwt 库来处理 JWT 编码与解码。
立即学习“PHP免费学习笔记(深入)”;
通过 Composer 安装:
composer require firebase/php-jwt
安装完成后可在控制器或自定义服务类中引入:
use FirebaseJWTJWT;use FirebaseJWTKey;
生成 Token(用户登录)
用户登录成功后,服务端生成 JWT 并返回给客户端。
示例代码:
$key = “your_secret_key”; // 必须保密,建议配置到 config 文件
$payload = [
“uid” => $user[‘id’],
“username” => $user[‘username’],
“iat” => time(),
“exp” => time() + 3600 // 1小时过期
];
$jwt = JWT::encode($payload, $key, ‘HS256’);
return json([‘token’ => $jwt]);
前端收到 token 后,通常存入 localStorage 或内存,并在每次请求的 Authorization 头中发送:
Authorization: Bearer <token>
验证 Token(中间件/行为)
需要创建一个基础控制器或行为(Behavior),在每个需要认证的接口前自动校验 token。
示例验证逻辑:
$authHeader = $_SERVER[‘HTTP_AUTHORIZATION’] ?? ”;
if (preg_match(‘/Bearers(S+)/’, $authHeader, $matches)) {
$jwt = $matches[1];
$key = “your_secret_key”;
try {
$decoded = JWT::decode($jwt, new Key($key, ‘HS256’));
// $decoded->uid 可用于后续业务
} catch (Exception $e) {
return json([‘code’ => 401, ‘msg’ => ‘Token无效或已过期’]);
}
} else {
return json([‘code’ => 401, ‘msg’ => ‘缺少Token’]);
}
配置建议与安全事项
- 密钥管理:将 secret key 存放在 config/jwt.php 配置文件中,不要硬编码
- Token 过期时间:合理设置 exp,可结合 refresh token 实现自动续期
- 黑名单机制:如需主动注销 token,可用 Redis 记录已失效的 jti 或 token ID
- HTTPS 传输:防止 token 被窃取
- 敏感信息不放入 payload:JWT 可被解码查看,仅放必要字段如 uid
基本上就这些。ThinkPHP 6 对 PSR-15 中间件支持良好,也可封装成中间件更便于复用。JWT 实现无状态登录的关键在于“签发 – 携带 – 验证”闭环,避免依赖 session,提升系统横向扩展能力。
以上就是thinkphp php redis js 前端 json composer 编码 session 后端 跨域 php composer 分布式 中间件 json thinkphp if 封装 require Session try catch Token 接口 redis https


