您好,我需要帮助,我一直在尝试学习如何使用 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
答案 0 :(得分:0)
我发现了实际问题。
包 PyJWT
在版本 2 中更改了 jwt.encode(...)
的返回类型。从现在开始它返回 string
而不是 byte string
。 Link
之后使用这些代码:
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')