7

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

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

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

谢谢。

4

2 回答 2

13

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

django-rest-framework-jwt (v. 1.11.0) 不支持此处描述的“刷新令牌” 。它只支持刷新未过期的令牌;它可以很容易地实现一个宽度为JWT_EXPIRATION_DELTA. 例如,使用设置

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

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

真正的刷新令牌,好吗?

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

但为什么?

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

于 2017-11-26T21:09:55.780 回答
5

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

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

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

于 2017-03-02T07:40:59.253 回答