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

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

【问题讨论】:

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

标签: django python-2.7 django-rest-framework jwt


【解决方案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 值。
      猜你喜欢
      • 2020-01-01
      • 2021-02-15
      • 2021-10-22
      • 2020-07-17
      • 2016-11-15
      • 2018-08-12
      • 2022-06-13
      • 2016-08-07
      相关资源
      最近更新 更多