使用 Laravel 8 和 Sanctum hasapitokens 通过记住我选项登录

use*_*235 4 laravel vue.js laravel-sanctum

因此,我使用 Vue 3、Laravel 8 构建 SPA 并使用 sainttum (hasapitokens) 来处理用户登录,但我找不到令牌有效的会话持续时间,因为我想将其与记住我选项结合使用当用户登录时。这可能吗?或者使用这些令牌是处理用户身份验证的一个坏例子?

小智 5

它通常是通过 cookie 完成的,但是在处理密室身份验证时,这有点棘手。

我想,当使用“记住我”选项登录时,为什么我不延长 圣所令牌的有效期呢?但显然你不能用 sainttum 制作具有不同到期日期的不同代币,所以这里有一个替代方案。


A. 拥有圣所令牌的能力:

创建用户令牌时,将“记住”能力添加到能力列表中。

$user->createToken('auth_token_name', ['remember']);
Run Code Online (Sandbox Code Playgroud)

然后在App/Providers/AppServiceProvider.php文件中的boot()方法中添加

Sanctum::authenticateAccessTokensUsing(function (PersonalAccessToken $token, $isValid) {
        if($isValid) return true;
        return $token->can('remember') && $token->created_at->gt(now()->subYears(5));
    });
Run Code Online (Sandbox Code Playgroud)

通常Laravel“记住cookie”的有效期是五年。在这里您可以自由地将其更改为任何持续时间。


B. 在令牌表中添加过期列 (TL;DR)

我自己还没有测试过这个,因为它有很长的路要走,但应该为您提供一种替代方案,以防您不想弄乱令牌的功能。首先,您需要修改 sainttum 迁移以包含过期列(如此处所示)。然后,您需要重写 PersonalAccessToken 模型(如此处所示)以在可填写属性中包含过期列。然后你可以添加到AppServiceProvider中的boot()方法

Sanctum::authenticateAccessTokensUsing(function (PersonalAccessToken $token, $isValid) {
    return $isValid ?: $token->expiration->gt(now());
});
Run Code Online (Sandbox Code Playgroud)

唯一的问题是您需要设置到期日期,因此要么从数据库中获取新创建的令牌并进行修改,要么重写 User 模型中的 HasApiToken::createToken 函数以使用到期参数。