Django REST JWT 刷新

Posted

技术标签:

【中文标题】Django REST JWT 刷新【英文标题】:Django REST JWT Refresh 【发布时间】:2017-07-21 17:11:01 【问题描述】:

使用 JWT 实现了 Django REST 和身份验证。 对于 JWT 令牌,我们必须在它过期之前对其进行刷新。 JWT 过期后不会给出新的令牌。

对于我的移动设备,我需要每 10 分钟刷新一次令牌 (JWT_EXPIRATION_DELTA)。 如果用户超过 10 分钟没有活动,那么我需要要求登录。 即使在 JWT 令牌过期后,有什么方法可以刷新令牌。 (我们可以将刷新时间限制为 2 天)

在移动设备中处理这种行为的最佳方法是什么。

谢谢。

【问题讨论】:

【参考方案1】:

您可以使用 Oauth2.0 中定义的刷新令牌

刷新令牌是用于获取访问令牌的凭据。刷新 令牌由授权服务器颁发给客户端,并且是 用于在当前访问令牌时获取新的访问令牌 失效或过期,

成功登录后,发出刷新和访问令牌。虽然访问令牌很快就会过期,但刷新令牌的寿命很长。安全地存储它,并在当前令牌过期时使用它来颁发新的访问令牌

【讨论】:

嗨。谢谢。我明白你的意思了。我们如何在 django-rest-framework-jwt 中进行操作。它在用户登录时只提供一个令牌。我们需要两个令牌才能登录。 ? getblimp.github.io/django-rest-framework-jwt。谢谢 似乎框架不支持我回答的“刷新令牌”。可以使用前一个令牌刷新令牌,但不能仅发布令牌以获取新的访问令牌。您的移动设备的替代方案是发布具有更长约 2 天到期时间的 JWT(不考虑使用其他框架)【参考方案2】:

刷新 django-rest-framework-jwt 中的令牌

django-rest-framework-jwt (v. 1.11.0) 不支持“刷新令牌”,例如 here。它只支持刷新未过期的令牌;它可以轻松实现宽度为JWT_EXPIRATION_DELTA 的滑动到期窗口。例如,使用设置

'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),

为了保持登录状态 (docs),用户不能处于非活动状态超过五分钟。

请提供真正的刷新令牌?

可以实现“刷新令牌”,它们是非常长寿(“永不过期”)的令牌,存储在数据库中,就像传统的“HTTP 会话和会话 ID”一样。这实际上已经在django-rest-framework-jwt-refresh-token 中为 django-rest-framework-jwt 实现了。另一种可能性是使用django-rest-framework-simplejwt,它还使用访问和刷新令牌实现了JWT(完整示例在Medium)。

但是..为什么?

与仅使用访问令牌 JWT 相比,使用刷新令牌可以在访问令牌过期后撤销访问。刷新令牌使得拥有非常长(“移动设备的生命周期”)持久令牌成为可能。有人可能会问,如果您要在数据库中创建刷新令牌集合并访问它,为什么不只使用会话(Cookie 中的 sessionid,以及数据库表中的会话数据)。使用过期时间为一小时的访问令牌意味着必须每小时访问一次数据库(而不是使用“传统”会话时每个 PUT/POST 请求一次)。此外,您还可以获得 JWT 令牌的所有常见好处(例如,在微服务网络中易于使用)。

【讨论】:

我正在使用 simplejwt。我只是想知道是否有任何方法可以使刷新令牌的到期时间无限 在三个项目中,截至 2020 年 6 月,只有 github.com/davesque/django-rest-framework-simplejwt 得到积极维护 @söze 是的。但是,目前 django-rest-framework-simplejwt 也在寻找维护者github.com/SimpleJWT/django-rest-framework-simplejwt/issues/207 @coderDude in simplejwt 您可以在 settings.py 中设置刷新令牌的生命周期,例如 'REFRESH_TOKEN_LIFETIME': timedelta(days=1000)。

以上是关于Django REST JWT 刷新的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 的单个 API 中获取访问令牌和刷新令牌(rest_framework_jwt)

单元测试 JWT 令牌过期:Django REST

在 Django REST 框架中使用 JWT 时,刷新令牌和访问令牌存储在哪里?

如何使用访问和刷新令牌返回自定义数据以识别 Django Rest Framework 简单 JWT 中的用户?

Django Rest Framework 不接受 JWT 身份验证令牌

如何使用 Simple JWT(django rest)将 JWT 令牌列入黑名单?