如何使用Laravel Passport创建刷新令牌?登录生成的令牌失效问题
Laravel 生成有效刷新令牌的解决方案
你之前用$user->createToken('Laravel')->accessToken生成的是个人访问令牌,这类令牌默认没有刷新功能。要实现可刷新的令牌,得用Laravel Passport的密码授权模式,步骤如下:
1. 创建密码授权客户端
在项目中运行命令创建密码授权类型的客户端:
php artisan passport:client --password
按提示输入客户端名称(比如Mobile App),回调地址可填http://localhost(测试环境用)。执行完成后会得到client_id和client_secret,将这两个值配置到.env文件中:
PASSPORT_CLIENT_ID=你的客户端ID PASSPORT_CLIENT_SECRET=你的客户端密钥
2. 调整登录逻辑,获取带刷新令牌的响应
不要再直接调用$user->createToken(),而是通过Passport的oauth/token端点发起请求,获取包含刷新令牌的完整响应:
use Illuminate\Support\Facades\Http; use Illuminate\Http\Request; public function login(Request $request) { // 验证用户账号密码 if (!auth()->attempt($request->only('email', 'password'))) { return response()->json(['message' => '账号或密码错误'], 401); } $user = auth()->user(); // 向Passport令牌端点请求 $response = Http::asForm()->post(config('app.url').'/oauth/token', [ 'grant_type' => 'password', 'client_id' => env('PASSPORT_CLIENT_ID'), 'client_secret' => env('PASSPORT_CLIENT_SECRET'), 'username' => $user->email, 'password' => $request->password, 'scope' => '', ]); return $response->json(); }
返回的JSON会包含access_token、refresh_token、expires_in(令牌有效期,单位秒)等字段,前端需保存refresh_token用于后续刷新操作。
3. 用刷新令牌获取新的访问令牌
当access_token过期后,调用以下逻辑获取新的令牌:
use Illuminate\Support\Facades\Http; use Illuminate\Http\Request; public function refreshToken(Request $request) { $response = Http::asForm()->post(config('app.url').'/oauth/token', [ 'grant_type' => 'refresh_token', 'client_id' => env('PASSPORT_CLIENT_ID'), 'client_secret' => env('PASSPORT_CLIENT_SECRET'), 'refresh_token' => $request->refresh_token, 'scope' => '', ]); return $response->json(); }
该请求会返回新的access_token和更新后的refresh_token。
关键说明
- 确保已完成Laravel Passport基础配置:安装依赖后运行
php artisan passport:install,并在User模型中引入Laravel\Passport\HasApiTokenstrait。 - 个人访问令牌(
createToken生成)适用于后台管理、第三方服务调用等无需频繁刷新的场景,不适合前端用户登录的刷新需求。
内容的提问来源于stack exchange,提问作者sathish
相关产品推荐
相关产品推荐

