当 Laravel 用作客户端时,JWT 存储在哪里进行身份验证?

Posted

技术标签:

【中文标题】当 Laravel 用作客户端时,JWT 存储在哪里进行身份验证?【英文标题】:Where to store the JWT for authentication when Laravel is used as client? 【发布时间】:2021-07-11 12:15:58 【问题描述】:

我使用 Laravel 6 和 GuzzleHTTP 7。

我可以设法向外部 (REST-) API 发出请求并成功授权并取回令牌:

"access_token":"FooXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjExNjkyNDQsImlhdCI6MTYxODU3aNzI0NCwibmJmIjoxNjE4NTc3MjQ0LCJpZGVudGl0eSI6MTQzfQ.wdDzVbE-5O8mfsIqzNvXFpv7THkYYp522HMpyEc8LX0BAR"

我必须在会话中明确保存此令牌吗? 我正在尝试在对外部 API 的每个后续请求中使用此令牌。

通过谷歌搜索,我只找到了 Laravel 如何生成 JWT 的教程,而不是当 Laravel 用作客户端并请求 JWT 时如何继续。

非常感谢任何帮助!

更新:Laravel APP 本身就是客户端(不管“内部”Laravel 的用户如何)。

【问题讨论】:

如果您的应用程序本身就是客户端并且无论哪个用户向您的应用程序发出请求,那么将令牌存储在数据库或持久性(ish)缓存中。如果令牌基于哪个用户向您的应用发出请求(例如,如果生成 JWT 令牌以代表用户发出请求,这意味着每个用户不同)然后将其存储在会话中 我同意,如果你的 laravel 应用程序没有被分离为后端和前端,那么你可以使用数据库或者我更喜欢缓存,如 memcached 或 redis 来保存会话,如果注销然后清除它 刷新 JWT 令牌时会发生什么,例如。月?有没有办法保持令牌有效,例如。自动替换为新令牌? 我个人将数据库缓存驱动程序用于持续时间更长的事情。您可以使用Cache::driver('database')->remember('jwt_token', 2629746, function() /* get the token */ ) 之类的东西,因此无论在何处运行此代码,如果缓存中没有令牌或缓存中的令牌已过期,它将获得一个新令牌。不过你需要事先set up the database as a cache 每当您获取 jwt 代码时检查时间,如果当前时间比到期时间少 5 分钟,则更新令牌 【参考方案1】:

从第三方服务获取令牌后,将其存储在某种形式的存储中(例如文件、数据库、缓存)。我建议使用缓存,因为它更快(如果您使用 Redis 等内存缓存),并且您可以设置 TTL。

如果令牌在一段时间后过期,并且没有刷新令牌,则将 TTL 设置为该日期/时间。

例子:

$ttl = Carbon::now()->addHour(); // set to when it expires or null if token doesn't expire
$jwtToken = Cache::remember('fooServiceJwtToken', $ttl, function () 
    $jwt = getJwtTokenUsingGuzzle(); // CHANGE
    return $jwt;
);

不要将数据存储在会话中,因为会话与使用您的应用程序的用户相关联。

【讨论】:

好的,听起来不错,谢谢!不过有一个问题:TTL 是什么意思? 生存时间。换句话说,当它到期时。

以上是关于当 Laravel 用作客户端时,JWT 存储在哪里进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

JWT Cookie 未正确存储 - Laravel

当我们有客户端会话时,为啥我们需要 JWT?

使用 JWT 获取令牌而不尝试用户凭据 Laravel?

golang使用jwt

JWT 从 Laravel 中的令牌中检索经过身份验证的用户

注销不适用于 Laravel JWT-auth