使用 Laravel JWT 重新认证时将旧令牌列入黑名单
Posted
技术标签:
【中文标题】使用 Laravel JWT 重新认证时将旧令牌列入黑名单【英文标题】:Blacklist old token on reauthenticate with Laravel JWT 【发布时间】:2016-08-31 18:13:25 【问题描述】:我正在使用 Laravel 5.2 和 tymondesigns/jwt-auth。
如果用户在没有注销的情况下再次登录,是否可以将旧令牌列入黑名单?我很好奇旧令牌的安全性。
关于如何改进移动设备上的“始终登录”的任何建议,因为我目前使用 Laravel 作为 API。
我当前的配置是:ttl = 1 小时 & refresh_ttl = 2 周
【问题讨论】:
【参考方案1】:您可以在用户第一次登录时创建一个表来存储令牌。
当该用户再次登录时,您会(从您的表中)获取旧令牌,然后将旧令牌列入黑名单,使用登录后立即生成的新令牌更新表。
【讨论】:
【参考方案2】:其实@Jeff 的回答可能会解决问题。我需要使用jwt.refresh
中间件。
我的 JWT 黑名单不起作用,因为我使用 array
作为 CACHE_DRIVER
我已经测试了将其恢复为file
,因为CACHE_DRIVER
和jwt.refresh
是有效的,旧令牌应该被列入黑名单。
我将此标记为答案。谢谢你,杰夫。
【讨论】:
我已将 CACHE_DRIVER 值更改为文件,现在登录和注销工作正常。但对于其他 API 则返回此错误。 “Repository.php 第 367 行中的 BadMethodCallException:此缓存存储不支持标记。”【参考方案3】:您可以使用jwt.refresh
中间件,它会发回一个新令牌作为响应头。如果您启用了黑名单,旧令牌将立即被列入黑名单。只需在您的登录路径中包含jwt.refresh
,然后确保捕获响应标头并更新您的本地密钥。然后你可以让你的ttl
和refresh_ttl
无限制(即60*60*24*365*10
)
【讨论】:
我已经添加了jwt.refresh
,我可以看到每个请求都在刷新令牌,但旧令牌并未列入黑名单。我检查了我的 jwt 配置文件,黑名单已经启用。有什么想法吗?
嗯,您是否启用了宽限期? 'blacklist_grace_period' => 0,
仍然无法将旧令牌列入黑名单。仍然不知道为什么以及如何解决这个问题。实际上,我在这个项目中使用SampleApi。以上是关于使用 Laravel JWT 重新认证时将旧令牌列入黑名单的主要内容,如果未能解决你的问题,请参考以下文章
如果用于认证的JWT令牌保存在HTTP-Only cookie中,你如何从cookie中读取它,以便我可以在请求头中包含它?