使用JWT实现Django REST和身份验证。 对于JWT令牌,我们必须在它到期之前刷新它。 过期后,JWT不会给出新的令牌。
对于我的移动设备,我需要每10分钟刷新一次令牌(JWT_EXPIRATION_DELTA)。 如果用户活动时间超过10分钟,那么我需要要求登录。 即使在JWT令牌过期后,我有什么方法可以刷新令牌。 (我们可以将刷新时间限制为2天)
什么是在移动设备中处理此行为的最佳方式。
感谢。
答案 0 :(得分:8)
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)。
可以实现"刷新令牌",这些令牌非常长寿("永不过期")令牌,存储在数据库中,就像传统的#34; HTTP会话和SessionIDs&#34 ;.实际上已经在django-rest-framework-jwt-refresh-token中为django-rest-framework-jwt实现了这一点。另一种可能性是使用django-rest-framework-simplejwt,它还使用访问和刷新令牌实现JWT(Medium处的完整示例)。
与仅使用Access Token JWT相比,使用Refresh Tokens可以在Access Token过期后撤销访问。 Refesh Tokens可以使持续令牌具有很长的时间("移动设备的生命周期和#34;)。有人可能会问,为什么你不应该坚持使用会话(Cookie中的sessionid和数据库表中的会话数据),如果要在数据库中创建Refresh Tokens的集合并访问它。使用过期时间为一小时的访问令牌意味着每小时必须访问一次数据库(而不是每次使用"传统"会话时每个PUT / POST请求一次)。此外,您还可以获得JWT令牌的所有常见优势(例如,在微服务网络中易于使用)。
答案 1 :(得分:4)
您可以使用Oauth2.0
中定义的刷新令牌刷新令牌是用于获取访问令牌的凭据。刷新 令牌由授权服务器发给客户端 用于在当前访问令牌时获取新的访问令牌 变得无效或过期,
成功登录后,发出刷新和访问令牌。虽然访问令牌很快就会到期,但刷新令牌很长时间。安全地存储它,并在当前的到期时使用它来发布新的访问令牌