Laravel JWT 身份验证

Posted

技术标签:

【中文标题】Laravel JWT 身份验证【英文标题】:Laravel JWT Auth 【发布时间】:2020-03-18 04:58:42 【问题描述】:

我在 Laravel 作为 API 后端工作,并为令牌实现了 JWT Auth

研究了JWT工作流程后,我的理解是:

1) JWT 令牌的到期日应最短(TTL:30 分钟)。

2) JWT 刷新令牌的有效期不应超过 1 周。

我理解的流程是:

1) 用户登录并收到 JWT 令牌。

2) 对于每个请求,它都应该向系统提供 JWT 令牌。

3) 如果 JWT 令牌过期,系统会检查 JWT 令牌并为其提供刷新令牌

我不明白的是:

1) 如果刷新令牌过期了怎么办?用户是否再次登录?

2) 手机每次向系统请求时,是否应该将过期的令牌替换为刷新令牌并提供当前保存的刷新令牌?

3) 如果未经授权的人拥有过期的令牌,他/她仍然可以访问该人的信息,因为系统总是为其提供刷新令牌并且循环继续。

4) 我必须在 Laravel 应用中存储刷新令牌吗?

我在 VerifyJWTToken.php 中间件中提取了 JWT 令牌检查

class VerifyJWTToken extends BaseMiddleware

    public function handle($request, Closure $next)
    
        try 
            if (!$user = JWTAuth::parseToken()->authenticate()) 
                return response()->json([
                    'status' => 'false',
                    'data' => null,
                    'message' => 'User not found'
                ]);
            
         catch (TokenExpiredException $e) 
            try 
                $refreshed = JWTAuth::refresh(JWTAuth::getToken());
                $user = JWTAuth::setToken($refreshed)->toUser();
                $request->merge(['refreshed_token'=> $refreshed]) 
             catch (JWTException $e) 
                return response()->json([
                    'status' => 'false',
                    'data' => null,
                    'message' => 'Token Invalid'
                ]);
            
         catch (JWTException $e) 
            return response()->json([
                'status' => 'false',
                'data' => null,
                'message' => 'Token Not Provided'
            ]);
        

        auth()->login($user);
        return $next($request);
    

【问题讨论】:

【参考方案1】:

1) 如果刷新令牌过期了怎么办?用户是否再次登录? => 是的,如果此令牌已过期,您应该重定向到登录页面。

4) 我必须在 Laravel 应用程序中存储刷新令牌吗? => 不需要,但您需要将此令牌保存在客户端应用程序(Localstogare、Cookie 等...)

【讨论】:

以上是关于Laravel JWT 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

没有数据库的 Laravel 中的 JWT 身份验证

Angular 和 Laravel 身份验证 JWT?

Laravel 5.7 + Spatie 权限 + JWT 身份验证

Laravel:实现 JWT 身份验证时出错

Laravel /w 离子 JWT 身份验证

Laravel JWT 身份验证