Проблема с генерацией токена при входе в систему

Здравствуйте, мне нужна помощь. Я пытался узнать, как создать токен с помощью django rest framework и pyjwt. Но всякий раз, когда я это делаю, когда собираюсь использовать логин, я получаю сообщение об ошибке, я хотел бы знать, связано ли это с кодом поскольку я видел несколько видео, и у меня такой же код, или это связано с чем-то на моем компьютере, и если да, то как я могу ее решить, ошибка следующая

Внутренняя ошибка сервера: / api / login Traceback (последний вызов последним): файл D: \ Users \ ferna \ Documents \ Cursos \ Youtube \ auth.env \ lib \ site-packages \ django \ core \ handlers \ exception.py, строка 47, во внутреннем ответе = get_response (запрос) Файл D: \ Users \ ferna \ Documents \ Cursos \ Youtube \ auth.env \ lib \ site-packages \ django \ core \ handlers \ base.py, строка 181, в _get_response response = wrapped_callback (request, * callback_args, ** callback_kwargs) Файл D: \ Users \ ferna \ Documents \ Cursos \ Youtube \ auth.env \ lib \ site-packages \ django \ views \ decorators \ csrf.py, строка 54, в wrapped_view return view_func (* args, ** kwargs) Файл D: \ Users \ ferna \ Documents \ Cursos \ Youtube \ auth.env \ lib \ site-packages \ django \ views \ generic \ base.py, строка 70, в просмотр return self.dispatch (request, * args, ** kwargs) Файл D: \ Users \ ferna \ Documents \ Cursos \ Youtube \ auth.env \ lib \ site-packages \ rest_framework \ views.py, строка 509, в отправке response = self.handle_exception (exc) Файл D: \ Users \ ferna \ Documents \ Cursos \ Youtube \ auth.env \ lib \ site-packages \ rest_framewor k \ 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 файл D: \ Users \ ferna \ Documents \ Cursos \ Youtube \ auth.env \ lib \ site-packages \ rest_framework \ views.py, строка 506, в отправке response = handler (request, * args, ** kwargs) Файл D: \ Users \ ferna \ Documents \ Cursos \ Youtube \ auth \ users \ views.py, строка 37, в post token = jwt.encode (payload, 'secret', algorithm = 'HS256'). decode ( 'utf-8') AttributeError: объект 'str' не имеет атрибута 'decode' [07 / May / 2021 21:18:23] ← [35; 1mPOST / 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 


person Fernando Lopez    schedule 08.05.2021    source источник
comment
Похоже, в пакете PyJWT v2.0.0 есть ошибка. Попробуйте сменить его версию. Источник: stackoverflow.com/a/65484529/7285863   -  person ishak O.    schedule 08.05.2021


Ответы (1)


Я нашел актуальную проблему.

Пакет PyJWT изменил тип возвращаемого значения jwt.encode(...) в версии 2. Теперь он возвращает string вместо byte string. Ссылка

После этого используйте эти коды:

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')
person ishak O.    schedule 08.05.2021