使用Django REST和JWT实现身份验证。对于JWT令牌,我们必须在其过期之前刷新它。一旦JWT过期,将不会提供新的令牌。
对于我的移动设备,我需要每10分钟(JWT_EXPIRATION_DELTA)刷新一次令牌。如果用户超过10分钟没有活动,则需要重新登录。有没有办法即使JWT令牌过期后也可以刷新令牌。 (我们可以将刷新时间限制为2天)
在移动端中处理这个行为的最佳方法是什么。
谢谢。
使用Django REST和JWT实现身份验证。对于JWT令牌,我们必须在其过期之前刷新它。一旦JWT过期,将不会提供新的令牌。
对于我的移动设备,我需要每10分钟(JWT_EXPIRATION_DELTA)刷新一次令牌。如果用户超过10分钟没有活动,则需要重新登录。有没有办法即使JWT令牌过期后也可以刷新令牌。 (我们可以将刷新时间限制为2天)
在移动端中处理这个行为的最佳方法是什么。
谢谢。
Django-rest-framework-jwt(版本1.11.0)不支持像这里描述的"刷新令牌"。它只支持刷新尚未过期的令牌,并且可以使用JWT_EXPIRATION_DELTA
设置一个滑动过期窗口的宽度,从而轻松实现滑动过期。例如:
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),
为了保持登录状态,用户不能无活动超过五分钟(文档)。
可以实现“刷新令牌(Refresh Tokens)”,这是一种非常长寿的(“从不过期”)令牌,与传统的“HTTP会话和SessionIDs”一样存储在数据库中。事实上,django-rest-framework-jwt已经在 django-rest-framework-jwt-refresh-token 中实现了此功能。另一种可能性是使用django-rest-framework-simplejwt,它还实现了具有访问和刷新令牌的JWT(完整示例请参见Medium)。
与仅使用Access Token JWT相比,使用Refresh Tokens可以在Access Token过期后撤销访问权限。 Refesh令牌使得令牌可以具有非常长的寿命(“移动设备寿命”)。如果您创建了Refresh Tokens集合并访问它,则可以询问为什么不仅使用会话(Cookie中的sessionid和数据库表中的会话数据)。使用一个小时过期时间的访问令牌意味着必须每小时访问一次数据库(而不是在使用“传统”会话时每个PUT / POST请求访问一次)。此外,您还可以获得JWT令牌的所有常规好处(例如,在微服务网络中使用的易用性)。