【问题标题】:Django Rest Framework JWT Refresh Token One Time UseDjango Rest Framework JWT 刷新令牌一次性使用
【发布时间】:2020-06-18 16:25:29
【问题描述】:

我正在使用 jwt 进行身份验证,我希望允许刷新令牌,但似乎刷新令牌仍然无限期有效。是否有限制刷新令牌使用量的实现?我知道JWT_REFRESH_EXPIRATION_DELTA 字段可以确定令牌的有效期,但这并不能解决当前的问题。

from rest_framework_jwt.views import obtain_jwt_token, refresh_jwt_token, verify_jwt_token


urlpatterns = [
    url(r"^jwt/create/?", obtain_jwt_token, name="jwt-create"),
    url(r"^jwt/refresh/?", refresh_jwt_token, name="jwt-refresh"),
    url(r"^jwt/verify/?", verify_jwt_token, name="jwt-verify"),
]

【问题讨论】:

    标签: django django-rest-framework django-authentication django-rest-framework-jwt


    【解决方案1】:

    我建议使用django-rest-framework-simplejwt。也是DRF推荐的官方JWT插件。

    如果您按照其文档正确配置,则刷新令牌默认只能使用一次。

    【讨论】:

    • 不幸的是,django-rest-framework-simplejwt 有它自己的问题。我注意到当密码被更改时,它不会使以前的令牌无效。 rest_framework_jwt 有一个字段JWT_GET_USER_SECRET_KEY,我可以设置它使以前的令牌无效。
    • 是的,这不是直接撤销 url 以使 simplejwt 中的令牌无效。我们需要设计自己的函数来撤销以删除特定的令牌。从the refresh token in django-rest-framework-jwt的文档来看,似乎也没有官方的方法来限制次数,因为refresh-token可以重复使用,直到JWT_REFRESH_EXPIRATION_DELTA定义的过期时间。基于此,将 JWT_REFRESH_EXPIRATION_DELTA 限制为一小段时间将是一个临时选择。
    • 很遗憾,这不是一个可行的选择,因为频繁注销会导致糟糕的用户体验。
    【解决方案2】:

    只需在 settings.py 文件中配置以下语句即可。

    JWT_AUTH = {
        'JWT_EXPIRATION_DELTA': datetime.timedelta(hours=1),
        'JWT_ALLOW_REFRESH': True,
        'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.views.custom_jwt.jwt_response_payload_handler',  // This is the file represents token add external values.
    }
    

    【讨论】:

    • 您能否详细说明此自定义负载处理程序以及它如何解决我的问题?
    • @Fendz242 你不需要那个,只需使用 'JWT_EXPIRATION_DELTA'JWT_ALLOW_REFRESH
    • @Fendz242 custom payload handler 仅用于将附加数据附加到令牌
    • 但这并不能解决我的问题。我希望刷新令牌是一次性使用,我已经启用了过期时间增量。
    猜你喜欢
    • 2019-08-01
    • 2017-06-25
    • 2017-03-30
    • 2019-02-27
    • 2019-06-20
    • 2019-02-26
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多