如何解码令牌并获取 Django 的 djangorestframework-jwt 包的信息

Posted

技术标签:

【中文标题】如何解码令牌并获取 Django 的 djangorestframework-jwt 包的信息【英文标题】:How to decode token and get back information for djangorestframework-jwt packagefor Django 【发布时间】:2017-03-24 03:51:51 【问题描述】:

我已经开始使用 djangorestframework-jwt 包而不是 PyJWT ,我只是不知道如何解码传入的令牌(我知道有验证令牌方法)......我只需要知道如何解码令牌并取回编码的信息......

【问题讨论】:

为什么需要解码? 我有一个自定义用户模型,我添加了“userType”来识别用户类型,如订阅者或编辑者或作者这样的东西....所以当向端点发出 api 请求时根据用户类型,响应会有所不同......所以我在令牌上编码了用户类型,当通过解码发出请求时,我将能够识别用户的类型...... 【参考方案1】:

回答可能为时已晚,但我们可以解码 jwt 并取回我们的有效载荷 使用 jwt 模块中的 jwt.decode

假设您获得的 jwt 令牌看起来像并且您的加密有效负载位于令牌中间


    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwib3JpZ19pYXQiOjE1MzIxMzg3ODQsImV4cCI6MTUzMjEzOTA4NCwidXNlcl9pZCI6MSwiZW1haWwiOiJwcmF0aWsucHVjc2RAZ21haWwuY29tIiwibXlmIjoxfQ.enG5qiSOPh98YYZBpScHSL5TM8RBz6JhU6uF0l1bZXM"

下面是sn-p的解决方法:

import jwt
#jwt.decode(<encoded token>,<secret key>,<algorthm>)
decodedPayload = jwt.decode('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwib3JpZ19pYXQiOjE1MzIxMzg3ODQsImV4cCI6MTUzMjEzOTA4NCwidXNlcl9pZCI6MSwiZW1haWwiOiJwcmF0aWsucHVjc2RAZ21haWwuY29tIiwibXlmIjoxfQ.enG5qiSOPh98YYZBpScHSL5TM8RBz6JhU6uF0l1bZXM',None,None)

【讨论】:

【参考方案2】:

Pratik Charwad 提供的答案确实有效,所以我将添加原生 djangorestframework-jwt 替代方案,它使用相同的 jwt 库进行解码:

from rest_framework_jwt.utils import jwt_decode_handler

decoded_payload = jwt_decode_handler('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwib3JpZ19pYXQiOjE1MzIxMzg3ODQsImV4cCI6MTUzMjEzOTA4NCwidXNlcl9pZCI6MSwiZW1haWwiOiJwcmF0aWsucHVjc2RAZ21haWwuY29tIiwibXlmIjoxfQ.enG5qiSOPh98YYZBpScHSL5TM8RBz6JhU6uF0l1bZXM')

【讨论】:

【参考方案3】:

我使用这种方法来解码令牌并验证用户。首先我没有使用algorithms=['HS256'],然后它给出了jwt.exceptions.DecodeError。最后,我添加了它。以下方法对我来说效果很好。

class VerifyEmail(generics.GenericAPIView):
def get(self, request):
    token = request.GET.get('token')
    print('payload ' + str(settings.SECRET_KEY))
    try:
        payload = jwt.decode(jwt=token, key=settings.SECRET_KEY, algorithms=['HS256'])
        print('payload 1 ' + str(payload))
        user = User.objects.get(id=payload['user_id'])
        if not user.is_active:
            user.is_active = True
            user.save()
        return Response('email': 'Successfully activated', status=status.HTTP_200_OK)
    except jwt.ExpiredSignatureError as e:
        return Response('error': 'Activations link expired', status=status.HTTP_400_BAD_REQUEST)
    except jwt.exceptions.DecodeError as e:
        return Response('error': 'Invalid Token', status=status.HTTP_400_BAD_REQUEST)

【讨论】:

@Madhura Prasanna,你能解释一下你是如何编码令牌的吗? @Lobbel 我用它来制作访问令牌和刷新令牌access_token = AccessToken.for_user(user) refresh_token = RefreshToken.for_user(user) @Madhura Prasanna,感谢您的回复。但是我会使用 Refresh 令牌仅用于验证,这不是没有必要的吗?我可以使用 django => default_token_generator 的内置函数。【参考方案4】:

这样做jwt.decode(token,settings.SECRET_KEY, algorithms=['HS256'])

【讨论】:

完美!,jwt.decode 不接受 None 作为 secret and algorithm 值。

以上是关于如何解码令牌并获取 Django 的 djangorestframework-jwt 包的信息的主要内容,如果未能解决你的问题,请参考以下文章

如何使用刷新令牌在 django-oauth-toolkit 上获取新的访问令牌?

如何从 Django 在前端获取 CSRF 令牌以及如何在 Postman 中使用它

如何从 django-oauth-toolkit 令牌获取当前登录用户?

django rest框架使用jwt RS256解码签名错误

如何在 Django 的单个 API 中获取访问令牌和刷新令牌(rest_framework_jwt)

Django RESTful Framework 如何从 HTTP 标头的令牌中获取用户模型?