在视图或消费者中使用 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 从用户实例获取身份验证令牌或更改用户名和密码组合

aspnet 核心 jwt 令牌作为获取参数

如何从.Net Core API 中的身份验证 JWT 令牌中获取身份用户?

在永久存储中跟踪 JWT

身份验证后请求其他服务时如何从 JWT 令牌获取用户名?

如何使用 jwt 令牌获取用户 ID