Django REST JWT Refresh

8

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

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

在移动端中处理这个行为的最佳方法是什么。

谢谢。

2个回答

13

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

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?

可以实现“刷新令牌(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令牌的所有常规好处(例如,在微服务网络中使用的易用性)。


我正在使用simplejwt。我只是想知道是否有任何方法可以使刷新令牌的过期时间无限。 - coderDude
2
在这三个项目中,截至2020年6月,只有https://github.com/davesque/django-rest-framework-simplejwt得到了积极维护。 - söze
2
@söze 是的。但是,目前django-rest-framework-simplejwt也在寻找维护人员 https://github.com/SimpleJWT/django-rest-framework-simplejwt/issues/207 - aijogja
在simplejwt中,您可以像这样在settings.py中设置刷新令牌的生命周期:'REFRESH_TOKEN_LIFETIME': timedelta(days=1000),其中1000表示天数。 - naheliegend

5
您可以使用刷新令牌,在Oauth2.0中定义了这一概念。刷新令牌是用于获取访问令牌的凭证。授权服务器会向客户端颁发刷新令牌,用于在当前访问令牌失效或过期时获取新的访问令牌。
成功登录后,应发放刷新令牌和访问令牌。尽管访问令牌很快就会过期,但刷新令牌的生命周期较长。请安全地存储它,并在当前访问令牌过期时使用它来发放新的访问令牌。

嗨。谢谢。我明白你的意思了。我们如何在django-rest-framework-jwt中实现呢?它只会在用户登录时提供一个令牌。我们需要两个令牌来进行登录。?http://getblimp.github.io/django-rest-framework-jwt/。谢谢。 - Karesh A
1
似乎框架不支持“刷新令牌”,正如我所回答的那样。可以使用先前的令牌来刷新令牌,但是不可能仅为获取新访问令牌而发出令牌。对于您的移动设备,另一种选择是发行一个具有更长过期时间的JWT(约2天,不考虑使用其他框架)。 - pedrofb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接