如何解码令牌并获取 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解码签名错误