【问题标题】:Revoking tokens using Django rest-framework-jwt使用 Django rest-framework-jwt 撤销令牌
【发布时间】:2017-06-25 18:30:42
【问题描述】:

我正在考虑允许用户撤销之前发布的令牌(是的,即使它们被设置为在 15 分钟后到期),但没有找到任何使用DRF-jwt 的方法。

现在,我正在考虑几个选项:

  • 希望 SO 上的人能告诉我如何开箱即用地执行此操作 ;-)
  • 使用 jti 字段作为计数器,并在撤销时要求 jti > last jti。
  • 将用户级盐添加到签名过程中,并在撤销时更改它
  • 在一些 Redis 数据库中存储实时令牌

以上方法都有吗?

【问题讨论】:

  • 我知道这是一个老问题,但是当我碰到它时,你为什么不使用 drf-jwt 的 JWT_GET_USER_SECRET_KEY 选项指定here?这个选项当时不可用吗?

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


【解决方案1】:

我们在项目中就是这样做的:

将jwt_issue_dt 添加到用户模型。

将original_iat 添加到有效负载。所以令牌刷新不会修改这个字段。

比较来自有效负载的original_iat 和user.jwt_issue_dt:

from calendar import timegm
from rest_framework_jwt.authentication import JSONWebTokenAuthentication

class CustomJSONWebTokenAuthentication(JSONWebTokenAuthentication):

    def authenticate_credentials(self, payload):
        user = super(CustomJSONWebTokenAuthentication, self).authenticate_credentials(payload)
        iat_timestamp = timegm(user.jwt_issue_dt.utctimetuple())
        if iat_timestamp != payload['iat']:
            raise exceptions.AuthenticationFailed('Invalid payload')
        return user

要撤销令牌,您只需更新字段user.jwt_issue_dt。

【讨论】:

  • 谢谢拉兹。我是否正确,此方法不支持多个令牌?虽然我猜你可以将时间戳与>< 进行比较,而不是!=。
  • 是的。我们只需要一个有效的令牌。但是if iat_timestamp > payload['iat']: raise 应该可以工作。
猜你喜欢
  • 2019-08-01
  • 2017-03-30
  • 2015-05-06
  • 2015-11-02
  • 2019-06-20
  • 2019-02-26
  • 2015-12-13
  • 2016-06-16
相关资源
最近更新 更多