登录时生成令牌的问题

时间:2021-05-08 01:21:12

标签: python django jwt token http-status-code-500

您好,我需要帮助,我一直在尝试学习如何使用 django rest 框架和 pyjwt 创建令牌 但是每当我要使用登录时,它都会给我一个错误如果是这样,我该如何解决它,错误是下一个

内部服务器错误:/api/login 回溯(最近一次调用最后一次): 文件“D:\Users\ferna\Documents\Cursos\Youtube\auth.env\lib\site-packages\django\core\handlers\exception.py”,第 47 行,在内部 响应 = 获取响应(请求) 文件“D:\Users\ferna\Documents\Cursos\Youtube\auth.env\lib\site-packages\django\core\handlers\base.py”,第 181 行,在 _get_response 响应=wrapped_callback(请求,*callback_args,**callback_kwargs) 文件“D:\Users\ferna\Documents\Cursos\Youtube\auth.env\lib\site-packages\django\views\decorators\csrf.py”,第54行,在wrapped_view 返回 view_func(*args, **kwargs) 文件“D:\Users\ferna\Documents\Cursos\Youtube\auth.env\lib\site-packages\django\views\generic\base.py”,第70行,查看 返回 self.dispatch(request, *args, **kwargs) 文件“D:\Users\ferna\Documents\Cursos\Youtube\auth.env\lib\site-packages\rest_framework\views.py”,第 509 行,在调度中 响应 = self.handle_exception(exc) 文件“D:\Users\ferna\Documents\Cursos\Youtube\auth.env\lib\site-packages\rest_framework\views.py”,第 469 行,在 handle_exception self.raise_uncaught_exception(exc) 文件“D:\Users\ferna\Documents\Cursos\Youtube\auth.env\lib\site-packages\rest_framework\views.py”,第 480 行,在 raise_uncaught_exception 提高 exc 文件“D:\Users\ferna\Documents\Cursos\Youtube\auth.env\lib\site-packages\rest_framework\views.py”,第 506 行,在调度中 响应 = 处理程序(请求,*args,**kwargs) 文件“D:\Users\ferna\Documents\Cursos\Youtube\auth\users\views.py”,第 37 行,在帖子中 token = jwt.encode(payload, 'secret', algorithm='HS256').decode('utf-8') AttributeError: 'str' 对象没有属性 'decode' [07/May/2021 21:18:23] ←[35;1m"POST /api/login HTTP/1.1" 500 96900←[0m

查看代码

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.exceptions import AuthenticationFailed
from .serializers import UserSerializer
from .models import User
import jwt, datetime


# Create your views here.
class RegisterView(APIView):
    def post(self, request):
        serializer = UserSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)


class LoginView(APIView):
    def post(self, request):
        email = request.data['email']
        password = request.data['password']

        user = User.objects.filter(email=email).first()

        if user is None:
            raise AuthenticationFailed('User not found!')

        if not user.check_password(password):
            raise AuthenticationFailed('Incorrect password!')

        payload = {
            'id': user.id,
            'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=60),
            'iat': datetime.datetime.utcnow()
        }

        token = jwt.encode(payload, 'secret', algorithm='HS256').decode('utf-8')

        response = Response()

        response.set_cookie(key='jwt', value=token, httponly=True)
        response.data = {
            'jwt': token
        }
        return response 

1 个答案:

答案 0 :(得分:0)

我发现了实际问题。

PyJWT 在版本 2 中更改了 jwt.encode(...) 的返回类型。从现在开始它返回 string 而不是 byte stringLink

之后使用这些代码:

encoded = jwt.encode({"some": "payload"}, key, algorithm="HS256")
result = jwt.decode(encoded, key, algorithms="HS256")

而不是这个:

result = jwt.encode(payload, 'secret', algorithm='HS256').decode('utf-8')