在视图或消费者中使用 jwt 令牌验证并获取用户
Posted
技术标签:
【中文标题】在视图或消费者中使用 jwt 令牌验证并获取用户【英文标题】:Validate and get the user using the jwt token inside a view or consumer 【发布时间】:2018-02-24 03:20:21 【问题描述】:我将django-rest-framework 用于 REST API。此外,对于 JSON Web 令牌身份验证,我使用的是 django-rest-framework-jwt。成功登录后,用户将获得一个令牌。我已经找到了如何使用 api 调用 verify a token,但是有什么方法可以在视图中验证令牌并获取该令牌的用户,类似于 request.user?
使用django-channels时,我需要它在消费者内部进行验证:
def ws_connect(message):
params = parse_qs(message.content["query_string"])
if b"token" in params:
token = params[b"token"][0]
# validate the token and get the user object
# create an object with that user
【问题讨论】:
你有权限添加到你查看吗?我假设您的视图是使用 DRF 的视图类之一创建的 @Swapnil 是的。实际上,在使用 django 频道时,我需要在消费者中使用它。我已经更新了问题。 我没有使用过 django-rest-frameork-jwt 库,但是通过他们的文档,如果你正确设置了库,他们应该设置request.user
,以防rest_framework_jwt.authentication.JSONWebTokenAuthentication
【参考方案1】:
使用TokenBackend
而不是VerifyJSONWebTokenSerializer
from rest_framework_simplejwt.backends import TokenBackend
token = request.META.get('HTTP_AUTHORIZATION', " ").split(' ')[1]
data = 'token': token
try:
valid_data = TokenBackend(algorithm='HS256').decode(token,verify=False)
user = valid_data['user']
request.user = user
except ValidationError as v:
print("validation error", v)
【讨论】:
使用这个代码我总是得到TokenBackendError: Token is invalid or expired
,即使是一个有效的新令牌。当手动创建后端或从AccessToken.get_token_backend()
获取后端时,这种情况不明显。似乎与jwt
如何处理有效负载有关。无论如何,创建对象 AccessToken 后,您可以使用AccessToken.payload
成员获取信息。
verify=False
有什么作用?【参考方案2】:
我正要验证令牌并通过导入 VerifyJSONWebTokenSerializer 类来获取用户。
from rest_framework_jwt.serializers import VerifyJSONWebTokenSerializer
data = 'token': token
valid_data = VerifyJSONWebTokenSerializer().validate(data)
user = valid_data['user']
希望这对像我这样的人有所帮助。
【讨论】:
我可以授权我的用户,但 django rest 框架仍然在说未经授权的用户以上是关于在视图或消费者中使用 jwt 令牌验证并获取用户的主要内容,如果未能解决你的问题,请参考以下文章
DRF 简单 jwt 从用户实例获取身份验证令牌或更改用户名和密码组合