Django REST JWT刷新

Kar*_*h A 5 jwt django-rest-framework django-rest-framework-jwt

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

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

什么是在Mobile中处理此行为的最佳方式.

谢谢.

np8*_*np8 9

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

Django的REST的架构,智威汤逊,例如描述(第1.11.0)不支持"刷新令牌" 在这里.它仅支持刷新未过期的令牌 ; 它可以很容易地实现宽度为的滑动到期窗口JWT_EXPIRATION_DELTA.例如,使用设置

'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
Run Code Online (Sandbox Code Playgroud)

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

真的刷新令牌好吗?

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

但为什么?

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

  • 截至 2020 年 6 月,这三个项目中只有 https://github.com/davesque/django-rest-framework-simplejwt 得到积极维护 (2认同)
  • @söze 是的。但是,目前 django-rest-framework-simplejwt 也在寻找维护者 https://github.com/SimpleJWT/django-rest-framework-simplejwt/issues/207 (2认同)

ped*_*ofb 5

您可以使用刷新令牌,如Oauth2.0 中所定义

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

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