🗣 Wd提问: thinkphp jwt
🤖 Ai回答: ThinkPHP 是一个流行的 PHP 开发框架,而 JWT(JSON Web Token)是一种用于在网络应用间安全传递信息的标准(RFC 7519)。在 ThinkPHP 中集成 JWT 可以实现无状态的用户身份验证,常用于前后端分离项目或 API 接口开发。
下面是一个基于 ThinkPHP 6 集成 JWT 的完整示例:
✅ 一、安装依赖
使用 Composer 安装 `firebase/php-jwt` 库:
bash
composer require firebase/php-jwt
✅ 二、创建 JWT 工具类
在 `app/common/service/JwtService.php` 创建 JWT 服务类:
php
<?php
namespace app\common\service;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
class JwtService
{
// 密钥(应放在配置文件中)
private $key = 'your_secret_key_here'; // 建议使用高强度密钥并存于 .env
// 过期时间(秒)
private $expire = 3600; // 1小时
/
* 生成 Token
* @param int $userId 用户ID
* @return string
*/
public function createToken($userId)
{
$payload = [
'iss' = 'your-app-name', // 签发者
'aud' = 'client', // 面向用户
'iat' = time(), // 签发时间
'exp' = time() + $this-expire, // 过期时间
'sub' = 'auth', // 主题
'uid' = $userId,
];
return JWT::encode($payload, $this-key, 'HS256');
}
/
* 解析 Token
* @param string $token
* @return object|false
*/
public function decodeToken($token)
{
try {
$decoded = JWT::decode($token, new Key($this-key, 'HS256'));
return $decoded;
} catch (\Exception $e) {
// Token 无效:过期、格式错误等
return false;
}
}
/
* 获取密钥
*/
public function getKey()
{
return $this-key;
}
}
🔐 注意:实际项目中,`$this-key` 应从 `.env` 文件读取:
env
JWT_SECRET=your_very_secure_random_string
然后用 `env('JWT_SECRET')` 获取。
✅ 三、登录接口生成 Token
在控制器中处理登录并返回 Token:
php
// app/controller/User.php
namespace app\controller;
use app\common\service\JwtService;
use think\Request;
use app\model\User; // 假设有 User 模型
class User
{
public function login(Request $request)
{
$username = $request-post('username');
$password = $request-post('password');
$user = User::where('username', $username)-find();
if (!$user !password_verify($password, $user['password'])) {
return json(['msg' = '账号或密码错误'], 401);
}
$jwtService = new JwtService();
$token = $jwtService-createToken($user-id);
return json([
'msg' = '登录成功',
'token' = $token,
'expire' = time() + 3600
]);
}
}
✅ 四、中间件验证 Token
创建中间件来保护需要认证的路由:
bash
php think make:middleware AuthMiddleware
编辑中间件文件 `app/middleware/AuthMiddleware.php`:
php
<?php
namespace app\middleware;
use app\common\service\JwtService;
use think\App;
use think\facade\Request;
use think\Response;
class AuthMiddleware
{
protected $app;
public function __construct(App $app)
{
$this-app = $app;
}
public function handle($request, \Closure $next)
{
$header = $request-header('Authorization');
if (!$header !preg_match('/^Bearer\s(\S+)$/', $header, $matches)) {
return json(['msg' = '缺少Token或格式错误'], 401);
}
$token = $matches[1];
$jwtService = new JwtService();
$payload = $jwtService-decodeToken($token);
if (!$payload) {
return json(['msg' = 'Token无效或已过期'], 401);
}
// 将用户信息存入请求对象,便于后续使用
$request-userId = $payload-uid;
return $next($request);
}
}
✅ 五、注册中间件并使用
方法1:全局中间件(可选)
在 `app/middleware.php` 添加:
php
\app\middleware\AuthMiddleware::class,
方法2:路由分组使用(推荐)
php
// routes/route.php
use think\facade\Route;
Route::group('api', function () {
Route::get('profile', 'User/profile'); // 需要登录
})-middleware(\app\middleware\AuthMiddleware::class);
✅ 六、受保护的接口示例
php
public function profile(Request $request)
{
$userId = $request-userId; // 从中间件获取
$user = User::find($userId);
unset($user-password);
return json(['data' = $user]);
}
✅ 七、前端使用建议(Axios)
javascript
// 登录后保存 token
axios.post('/login', { username, password })
.then(res = {
const token = res.data.token;
localStorage.setItem('token', token);
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
});
// 请求拦截器自动加 header
axios.interceptors.request.use(config = {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
✅ 八、最佳实践建议
1、密钥安全:JWT 密钥必须足够复杂,存储在 `.env`。
2、Token 刷新机制:可额外实现 refresh_token。
3、黑名单登出:JWT 本身无状态,如需立即失效,需配合 Redis 黑名单。
4、HTTPS:生产环境务必使用 HTTPS 防止 Token 被窃取。
5、过期时间不宜过长:建议 30分钟~2小时,结合刷新机制。
📚 参考文档
[Firebase JWT GitHub](https://github.com/firebase/php-jwt)
[ThinkPHP 6 官方文档](https://www.kancloud.cn/manual/thinkphp6_0/content)
如果你使用的是 ThinkPHP 5.x**,步骤类似,但命名空间和中间件注册方式略有不同,可以告诉我版本,我提供对应适配方案。
是否需要我提供一个完整的 GitHub 示例项目结构?
📣 商家广告:





0
IP地址: 35.58.190.9
搜索次数: 0
提问时间: 2025-11-08 09:32:47
🛒 域名购买:
tui.men
jc9.com.cn
z-j.net
kingwarchina.com
jqjp.cn
te.biz
43.gold
jldj.cn
32.gs
2.sd.cn
❓️ 热门提问:
网站高防服务器
搭建 服务器
虚拟空间实验室
如何托管网店
免费5款idc销售系统
服务器和vps和空间的区别
最便宜的汽车是哪一款
怎么更换dns服务器
怎么进云服务器
云主机和服务器租用
豌豆Ai站群搜索引擎系统
🌐 域名评估:
sun.ah.cn
vtol.cool
oppo.nx.cn
f.sc.cn
su7.xj.cn
catl.xj.cn
zhoe.cn
mm.tj.cn
le.tj.cn
ee.ln.cn
⛏ 最新挖掘:
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜
🖌 热门作画:
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊:
🔗 友情链接:
收录查询
谷歌排名优化
ai提问
🧰 站长工具:
Ai工具 whois查询 搜索
📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。