使用 Django rest-framework-jwt 撤销令牌
Revoking tokens using Django rest-framework-jwt
我正在考虑允许用户撤销之前颁发的令牌(是的,即使它们设置为在 15 分钟后过期),但没有找到任何方法来使用 DRF-jwt。
目前,我正在考虑几个选项:
- 希望 SO 上的某个人会告诉我如何开箱即用;-)
- 使用 jti 字段作为计数器,并且在撤销时要求 jti > last jti。
- 在签名过程中添加用户级盐,并在撤销时更改
- 在一些 Redis 数据库中存储实时令牌
以上任何一种方法都可以吗?
我们在项目中是这样做的:
将 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
。
我正在考虑允许用户撤销之前颁发的令牌(是的,即使它们设置为在 15 分钟后过期),但没有找到任何方法来使用 DRF-jwt。
目前,我正在考虑几个选项:
- 希望 SO 上的某个人会告诉我如何开箱即用;-)
- 使用 jti 字段作为计数器,并且在撤销时要求 jti > last jti。
- 在签名过程中添加用户级盐,并在撤销时更改
- 在一些 Redis 数据库中存储实时令牌
以上任何一种方法都可以吗?
我们在项目中是这样做的:
将 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
。