要在ThinkPHP(TP)框架中集成JWT(JSON Web Token),你需要遵循以下步骤:
首先,你需要一个JWT库来处理Token的生成和验证。推荐使用firebase/php-jwt库。通过Composer安装:
composer require firebase/php-jwt
在application/library目录下创建一个名为Jwt.php的文件,并编写以下代码:
<?php
namespace library;
use \Firebase\JWT\JWT;
class Jwt
{
// 生成token
public static function createToken($userId, $secretKey, $expTime)
{
$payload = [
'iss' => 'your-issuer', // 签发者
'aud' => 'your-audience', // 接收方
'iat' => time(), // 签发时间
'nbf' => time() + 10, // 在此之前不生效
'exp' => time() + $expTime, // 过期时间
'data' => [
'userId' => $userId, // 用户ID
],
];
return JWT::encode($payload, $secretKey);
}
// 解析token
public static function verifyToken($token, $secretKey)
{
try {
$decoded = JWT::decode($token, $secretKey, ['HS256']);
return $decoded->data;
} catch (\Exception $e) {
return false;
}
}
}
在application/config.php文件中添加JWT密钥和过期时间的配置:
return [
// ...
'jwt_secret_key' => 'your-secret-key',
'jwt_exp_time' => 3600, // 1小时
];
在需要生成Token的地方调用createToken方法:
use library\Jwt;
$userId = 1; // 用户ID
$secretKey = config('jwt_secret_key');
$expTime = config('jwt_exp_time');
$token = Jwt::createToken($userId, $secretKey, $expTime);
在需要验证Token的地方调用verifyToken方法:
use library\Jwt;
$token = 'your-token';
$secretKey = config('jwt_secret_key');
$result = Jwt::verifyToken($token, $secretKey);
if ($result === false) {
// Token无效或已过期
} else {
// Token有效,获取用户ID
$userId = $result->userId;
}
你可以创建一个中间件来验证Token,这样可以确保每次请求都会进行Token验证。在application/middleware.php文件中添加JWT中间件:
return [
// ...
'jwt' => \app\middleware\JwtMiddleware::class,
];
然后在application/middleware/JwtMiddleware.php文件中编写中间件代码:
<?php
namespace app\middleware;
use library\Jwt;
use think\facade\Config;
class JwtMiddleware
{
public function handle($request, \Closure $next)
{
$token = $request->header('Authorization');
if (!$token) {
return json(['code' => 401, 'msg' => '缺少Token']);
}
$secretKey = Config::get('jwt_secret_key');
$result = Jwt::verifyToken($token, $secretKey);
if ($result === false) {
return json(['code' => 401, 'msg' => 'Token无效或已过期']);
}
// 将用户ID存储到请求对象中
$request->userId = $result->userId;
return $next($request);
}
}
最后,在需要验证Token的路由中应用JWT中间件:
Route::group('api', function () {
// ...
})->middleware('jwt');
现在,你已经在ThinkPHP框架中集成了JWT。根据实际需求,你可能需要对代码进行一些调整。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。