如何在 Laravel 5.7 中生成 JWT 刷新令牌
Posted
技术标签:
【中文标题】如何在 Laravel 5.7 中生成 JWT 刷新令牌【英文标题】:How to generate JWT refresh token in Laravel 5.7 【发布时间】:2019-05-25 13:10:19 【问题描述】:首先,让我承认我是 API 新手,现在我正在使用 Laravel 开发 JWT。我正在使用 tymon\jwt-auth(具体来说是tymon/jwt-auth:dev-develop --prefer-source
)。我浏览了一些教程并能够生成 JWT 访问令牌。
这是我的登录代码:
public function login()
$credentials = request(['email', 'password']);
if (!$token = auth('api')->attempt($credentials))
return response()->json(['error' => 'Unauthorized'], 401);
return response()->json([
'status' => 'success',
'message' => 'Login successful',
'data' => [
'access_token' => $token,
],
]);
我还需要获取刷新令牌和访问令牌,但找不到适用于我的情况的代码。
我尝试在代码中添加这些行:
$refresh_token = JWTAuth::refresh($token);
但邮递员返回此错误:
文件中需要一个令牌 /var/www/brochill-api/vendor/tymon/jwt-auth/src/JWT.php 在第 331 行
如果需要,我还可以提供我使用的其他配置 sn-ps。请帮忙!
【问题讨论】:
你可以在这里查看。 ***.com/questions/41325250/… 假设您设置正确,您只需调用auth()->refresh()
而不传递任何内容,因为它是受保护的端点,并且会解析现有令牌
@ahmad ,在我的情况下,auth()->refresh()
没有成功,经过反复试验,我添加了 auth('api')->refresh($token)
并生成了刷新令牌。所以我可以说问题已经解决了。谢谢你的时间:)
【参考方案1】:
让我们从创建/refresh
路由开始:
Route::post('refresh', 'AuthController@refresh');
现在,在AuthController
,
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
class AuthController extends Controller
/**
* Create a new AuthController instance.
*
* @return void
*/
public function __construct()
$this->middleware('auth:api', ['except' => ['login']]);
/**
* Get a JWT via given credentials.
*
* @return \Illuminate\Http\JsonResponse
*/
public function login()
//
/**
* Get the authenticated User.
*
* @return \Illuminate\Http\JsonResponse
*/
public function me()
//
/**
* Log the user out (Invalidate the token).
*
* @return \Illuminate\Http\JsonResponse
*/
public function logout()
//
/**
* Refresh a token.
*
* @return \Illuminate\Http\JsonResponse
*/
public function refresh()
return $this->respondWithToken(auth()->refresh());
/**
* Get the token array structure.
*
* @param string $token
*
* @return \Illuminate\Http\JsonResponse
*/
protected function respondWithToken($token)
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => auth()->factory()->getTTL() * 60
]);
refresh()
函数刷新访问令牌并使当前令牌无效。
有关这些的更多信息,您可以查看tymon/jwt-auth
的官方文档,可以找到here。
【讨论】:
token过期了再尝试刷新token怎么办?请注意:refresh_ttl=2 周,ttl=15(分钟)以上是关于如何在 Laravel 5.7 中生成 JWT 刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.7 + Spatie 权限 + JWT 身份验证
如何在登录过程中生成rest_framework_jwt token