在视图或消费者中验证并获取使用JWT令牌的用户

8
我正在使用django-rest-framework进行REST API。另外,为了进行JSON Web Token身份验证,我正在使用django-rest-framework-jwt。成功登录后,用户会收到一个令牌。我已经找到了如何通过api调用验证令牌,但有没有办法在视图内验证令牌并获取该令牌的用户,类似于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
@Swapnil 是的。实际上,我需要在使用Django Channels时在消费者中使用它。我已经更新了问题。 - Robin
我没有使用django-rest-framework-jwt库,但是通过他们的文档,如果您正确设置了该库,它应该在rest_framework_jwt.authentication.JSONWebTokenAuthentication的情况下设置request.user - Swapnil
2个回答

21

我正要通过导入VerifyJSONWebTokenSerializer类来验证令牌并获取用户。

from rest_framework_jwt.serializers import VerifyJSONWebTokenSerializer

data = {'token': token}
valid_data = VerifyJSONWebTokenSerializer().validate(data)
user = valid_data['user']

希望这能帮助像我一样的人。


1
我能够授权我的用户,但是Django Rest Framework仍然显示未经授权的用户。 - gamer

6

使用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)

1
使用这段代码,即使是有效的新令牌,我总是会得到“TokenBackendError:令牌无效或已过期”的错误。无论是手动创建后端还是从AccessToken.get_token_backend()获取它,都会发生这种情况。似乎与jwt如何处理有效载荷有关。无论如何,一旦创建了AccessToken对象,您就可以使用AccessToken.payload成员获取信息。 - jlandercy
verify=False 是什么作用? - lr_optim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接