在ThinkPHP框架下使用JWT进行用户认证和授权,需要以下步骤:
可以通过 composer 安装 firebase/php-jwt
库,该库提供了 JWT 相关的功能。
composer require firebase/php-jwt
创建一个控制器用于处理认证相关的逻辑,例如登录、注册、刷新 token 等。
namespace app\controller;
use Firebase\JWT\JWT;
class Auth
{
// 登录
public function login()
{
// 验证用户名和密码...
// 验证通过,生成 token
$payload = [
'iss' => 'localhost', // 签发者
'sub' => $user_id, // 主题
'iat' => time(), // 签发时间
'exp' => time() + 3600, // 过期时间
];
$token = JWT::encode($payload, 'secret_key');
return ['token' => $token];
}
// 刷新 token
public function refresh()
{
// 获取旧 token
$old_token = $_SERVER['HTTP_AUTHORIZATION'] ?? null;
if (!$old_token) {
throw new Exception('Token not provided', 401);
}
// 解码旧 token
try {
$decoded = JWT::decode($old_token, 'secret_key', array('HS256'));
} catch (Exception $e) {
throw new Exception('Invalid token', 401);
}
// 生成新 token
$payload = [
'iss' => 'localhost', // 签发者
'sub' => $decoded->sub, // 主题
'iat' => time(), // 签发时间
'exp' => time() + 3600, // 过期时间
];
$token = JWT::encode($payload, 'secret_key');
return ['token' => $token];
}
}
配置路由,将请求路由到认证控制器的相应方法上。
use think\facade\Route;
Route::post('login', 'Auth/login');
Route::post('refresh', 'Auth/refresh');
创建一个中间件用于验证 token,如果 token 验证失败,直接返回 401 错误。
namespace app\middleware;
use Firebase\JWT\JWT;
class AuthMiddleware
{
public function handle($request, \Closure $next)
{
$token = $request->header('Authorization') ?? $request->post('token') ?? null;
if (!$token) {
return json(['message' => 'Token not provided'], 401);
}
try {
$decoded = JWT::decode($token, 'secret_key', array('HS256'));
} catch (Exception $e) {
return json(['message' => 'Invalid token'], 401);
}
$request->userid = $decoded->sub;
return $next($request);
}
}
然后在 app\route\middleware.php
文件中配置中间件。
return [
'auth' => app\middleware\AuthMiddleware::class,
];
在需要进行认证的控制器上使用中间件,例如:
namespace app\controller;
use think\facade\Db;
class User
{
public function list()
{
$users = Db::table('users')->select();
return $users;
}
// 需要认证的方法
public function profile()
{
$user_id = request()->userid;
$user = Db::table('users')->where('id', $user_id)->find();
return $user;
}
// 使用中间件
protected $middleware = ['auth'];
}
这样,在调用 profile
方法时,会先经过 AuthMiddleware
验证 token,如果验证通过,就可以获取到 $user_id
,然后根据 $user_id
获取用户信息。
以上就是在 ThinkPHP 框架下使用 JWT 进行用户认证和授权的步骤。