4

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

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

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

以上任何一条路都可以吗?

4

1 回答 1

4

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

添加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

于 2017-02-08T09:34:47.150 回答