Laravel/Vue - JWT 令牌记住我

Posted

技术标签:

【中文标题】Laravel/Vue - JWT 令牌记住我【英文标题】:Laravel/Vue - JWT Token Remember-me 【发布时间】:2020-12-24 00:59:23 【问题描述】:

我正在使用 Laravel 和 JWT 进行身份验证系统,但我有一些问题。

我使用tymon jwt 包

    我在登录时生成了一个令牌,有效期为 24 小时,如果选中记住我复选框,则有效期为 2 年。 除了在这 2 年内我应该如何续订令牌,出于安全原因,我想我不必保留相同的令牌?

    我必须在数据库中存储一些东西吗?比如一个记住我的令牌,或者一个刷新令牌?

我对这一切有点迷茫,我想了解如何继续。 我已经在网上搜索了很多,但找不到我想要的,或者不完整。

public function login()
    
        $credentials = request(['email', 'password']);
        $ttl = env('JWT_TTL');

        if (request(['remember_me']) == true) 
            $ttl = env('JWT_REMEMBER_TTL');
        

        if (!$token = auth()->attempt($credentials)) 
            return response()->json(['error' => 'Wrong credentials'], 401);
        

        return $this->respondWithToken($token, $ttl);
    
protected function respondWithToken($token, $ttl)
    
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => $ttl
        ]);
    
JWT_TTL=1440
JWT_REMEMBER_TTL=1051200

提前致谢,

【问题讨论】:

【参考方案1】:

您不必在数据库中存储任何内容。

创建两个 JWT,一个作为访问令牌(登录),一个用于记住我。将访问令牌设置为像往常一样过期 24 小时,并将记住我令牌设置为过期 2 年。

在您的受保护路由上,检查访问令牌是否已过期,如果已过期,请检查记住我的令牌。如果存在记住我的令牌,则发出一个新的访问令牌。

【讨论】:

这就是我要做的,但目前令牌除了 TTL 之外是相同的,所以我必须区分普通令牌和记住我的令牌,以便能够检查我是否刷新它。但无论如何,谢谢,现在我知道我不需要在 db 中存储任何东西。 嗨@Retorks,我想处理相同的功能,请指导我如何处理发布新的访问令牌以及此代码应放置在何处? @Asif 你可以使用护照来简化这个 @Retorks 我正在使用 JWT,这可以在 JWT 中处理吗?【参考方案2】:

您也可以通过这种方式处理它,并且使用 setTTL 函数在 JWT 包中正常工作,并在 .env 文件中定义两个不同的时间。

$ttl = ($request->remember_me === true) ? env('JWT_REMEMBER_TTL') : env('JWT_TTL'); if (! $token = auth()->setTTL($ttl)->attempt($credentials))

【讨论】:

以上是关于Laravel/Vue - JWT 令牌记住我的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 DRF JWT 实现记住我的功能?

JSON Web 令牌过期和记住我功能

为啥要记住我的令牌?

我有一个关于登录“记住我”、JWT 和所有相关内容的逻辑问题

如何修复“无效的记住我令牌(系列/令牌)不匹配”错误?

AngularJS 使用 JWT Auth 记住我的功能