Laravel中使用tymon/jwt-auth生成Refresh Token的实现方法
在Laravel中用tymon/jwt-auth同时返回Access Token和Refresh Token
嘿,刚好我之前做过类似的需求,tymon/jwt-auth本身就内置了生成refresh token的能力,不用额外折腾,给你一步步说怎么实现:
1. 确认配置(可选但建议)
首先检查你的config/jwt.php配置文件,确保以下两个参数是正常设置的:
'ttl':Access Token的有效期(默认60分钟)'refresh_ttl':Refresh Token的有效期(默认20160分钟,也就是2周)
你可以根据自己的业务需求调整这两个值,比如把refresh_ttl设为更大的数值,让用户不用频繁登录。
2. 修改登录逻辑,同时生成两个Token
既然你已经能通过JWTAuth::attempt($credentials)获取到access token,那只需要在这个基础上,调用JWTAuth::refresh()方法就能生成对应的refresh token了。
完整的示例代码大概是这样的:
use Illuminate\Http\Request; use Tymon\JWTAuth\Facades\JWTAuth; public function login(Request $request) { // 验证用户提交的凭证(比如邮箱和密码) $credentials = $request->validate([ 'email' => 'required|email', 'password' => 'required' ]); // 尝试生成access token if (!$token = JWTAuth::attempt($credentials)) { return response()->json(['error' => '无效的登录凭证'], 401); } // 生成对应的refresh token $refreshToken = JWTAuth::refresh($token); // 按照你想要的格式返回 return response()->json([ 'jwt' => $token, 'refresh_token' => $refreshToken ]); }
3. 后续Refresh Token的使用(额外提示)
如果用户后续需要用refresh token获取新的access token,你可以写一个专门的接口:
public function refresh(Request $request) { try { // 从请求中获取refresh token(可以放在请求头或者请求体里) $refreshToken = $request->input('refresh_token'); // 生成新的access token $newToken = JWTAuth::refresh($refreshToken); // 这里也可以返回新的refresh token(可选,看你是否要滚动刷新有效期) return response()->json([ 'jwt' => $newToken, 'refresh_token' => JWTAuth::refresh($newToken) ]); } catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e) { return response()->json(['error' => '无效的Refresh Token'], 401); } catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e) { return response()->json(['error' => 'Refresh Token已过期,请重新登录'], 401); } }
注意事项
- 确保你的用户模型已经正确实现了
Tymon\JWTAuth\Contracts\JWTSubject接口(你已经能生成access token,应该已经做了这一步) - 记得在路由中给refresh接口加上合适的中间件,比如不需要auth中间件,但要验证refresh token的合法性
内容的提问来源于stack exchange,提问作者Stefano Maglione
相关产品推荐
相关产品推荐

