ThinkPHP8如何实现JWT接口鉴权?
在thinkphp 8中实现jwt鉴权,核心是安装第三方库并编写中间件拦截请求。推荐使用 firebase/php-jwt 库,通过自定义中间件解析 authorization 头中的token,验证签名后注入用户信息到 request 对象,未通过则返回401状态码。

composer require firebase/php-jwt
创建中间件 app/middleware/Auth.php:
<?php namespace app\middleware;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use think\facade\Request;
class Auth
{
private $secret = 'your-secret-key';
public function handle($request, \Closure $next)
{
$header = Request::header('authorization');
if (!$header || !preg_match('/^Bearer (.+)$/', $header, $matches)) {
return json(['code' => 401, 'msg' => 'Missing Token'], 401);
}
try {
$payload = JWT::decode($matches[1], new Key($this->secret, 'HS256'));
Request::merge(['user_id' => $payload->sub, 'role' => $payload->role]);
} catch (\Exception $e) {
return json(['code' => 401, 'msg' => 'Invalid Token'], 401);
}
return $next($request);
}
}
注册中间件 app/middleware.php:
<?php return [
'auth' => \app\middleware\Auth::class,
];
路由应用中间件 route/app.php:
<?php use think\facade\Route;
Route::group(function () {
Route::get('profile', 'Index/profile');
})->middleware('auth');
token怎么校验?
Token校验依赖于 JWT::decode() 方法,它会自动验证签名、过期时间(exp)和签发者(iss)。若签名不匹配或Token已过期,将抛出异常,中间件捕获后返回错误。

<?php // 生成Token示例
$payload = [
'sub' => 123,
'role' => 'admin',
'iat' => time(),
'exp' => time() + 3600
];
$token = JWT::encode($payload, 'your-secret-key', 'HS256');
echo $token;
校验逻辑已在中间件中实现,重点在于确保密钥一致且时间戳正确。
基于程序中某个输入、条件或结果的具体问题
当 Authorization 头格式为 Bearer abc.def.ghi 但 abc.def.ghi 不是有效JWT时,JWT::decode() 会抛出 UnexpectedValueException,中间件将其转换为401响应。
,
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











