Django REST JWT 刷新

Django REST JWT Refresh

使用 JWT 实现了 Django REST 和身份验证。 对于 JWT 令牌,我们必须在它过期之前刷新它。 JWT 过期后将不会提供新令牌。

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

在 Mobile 中处理此行为的最佳方法是什么。

谢谢。

您可以使用 Oauth2.0

中定义的刷新令牌

Refresh tokens are credentials used to obtain access tokens. Refresh tokens are issued to the client by the authorization server and are used to obtain a new access token when the current access token becomes invalid or expires,

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

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

django-rest-framework-jwt (v. 1.11.0) does not support "Refresh Tokens" as described for example here。只支持刷新未过期的token;它可以轻松实现宽度为 JWT_EXPIRATION_DELTA 的滑动过期 window。例如,设置

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

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

真正的刷新令牌,好吗?

可以实现“刷新令牌”,这是一种非常长寿命(“永不过期”)的令牌,存储在数据库中,就像传统的“HTTP 会话和 SessionID”一样。这实际上已经在 django-rest-framework-jwt-refresh-token. Another possibility is to use django-rest-framework-simplejwt which also implements the JWT with Access and Refresh Tokens (full example at Medium).

中为 django-rest-framework-jwt 实现了

但是..为什么?

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