使用Django rest-framework-jwt撤销令牌

时间:2017-02-08 08:26:23

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

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

现在,我正在考虑几种选择:

  • 希望有人能告诉我如何开箱即用; - )
  • 使用jti字段作为计数器,并且在撤销时,需要jti>最后jti。
  • 将用户级salt添加到签名过程,并在撤消时更改
  • 在一些Redis DB中存储实时令牌

上述任何一种方法都可以使用吗?

1 个答案:

答案 0 :(得分:4)

我们在项目中这样做了:

jwt_issue_dt添加到用户模型。

original_iat添加到有效负载。因此令牌刷新不会修改此字段。

比较有效负载original_iatuser.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