Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jwt.decode() got an unexpected keyword argument 'verify'

Tags:

I can generate the token with the route api/token but I can't use it after. All was functional before, but now I have this error from django rest framework, and I don't know why.

    File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner     response = get_response(request)   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response     response = wrapped_callback(request, *callback_args, **callback_kwargs)   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view     return view_func(*args, **kwargs)   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/django/views/generic/base.py", line 69, in view     return self.dispatch(request, *args, **kwargs)   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch     response = self.handle_exception(exc)   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception     self.raise_uncaught_exception(exc)   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception     raise exc   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/views.py", line 497, in dispatch     self.initial(request, *args, **kwargs)   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/views.py", line 414, in initial     self.perform_authentication(request)   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/views.py", line 324, in perform_authentication     request.user   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/request.py", line 227, in user     self._authenticate()   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework/request.py", line 380, in _authenticate     user_auth_tuple = authenticator.authenticate(self)   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework_simplejwt/authentication.py", line 40, in authenticate     validated_token = self.get_validated_token(raw_token)   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework_simplejwt/authentication.py", line 94, in get_validated_token     return AuthToken(raw_token)   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework_simplejwt/tokens.py", line 43, in __init__     self.payload = token_backend.decode(token, verify=verify)   File "/home/mathieu/.local/share/virtualenvs/back-aSs_Rzmq/lib/python3.8/site-packages/rest_framework_simplejwt/backends.py", line 90, in decode     return jwt.decode( TypeError: decode() got an unexpected keyword argument 'verify' 

I follow the simple dango rest simple jwt example.

My settings.py

REST_FRAMEWORK = {     "DEFAULT_AUTHENTICATION_CLASSES": [         "rest_framework_simplejwt.authentication.JWTAuthentication",     ], } 

And my views.py

from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from .models import User from .serializers import UserSerializer, UserRegistrationSerializer from django.http import Http404 from rest_framework import status from django.views.decorators.csrf import csrf_exempt from django.core.exceptions import ObjectDoesNotExist   class UserList(APIView):     permission_classes = [IsAuthenticated]      def get(self):         users = User.objects.all().exclude(is_staff=True).order_by("id")         serializer = UserSerializer(users, many=True)         return Response(serializer.data)      def post(self, request):         serializer = UserRegistrationSerializer(data=request.data)         if serializer.is_valid():             serializer.save()             return Response(serializer.data, status=status.HTTP_201_CREATED)         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)   class UserDetail(APIView):     permission_classes = [IsAuthenticated]      @csrf_exempt     def get_object(self, pk):         try:             return User.objects.get(pk=pk)         except ObjectDoesNotExist:             raise Http404      @csrf_exempt     def get(self, request, pk):         user = self.get_object(pk=pk)         serializer = UserSerializer(user)         return Response(serializer.data)      @csrf_exempt     def put(self, request, pk):         user = self.get_object(pk)         serializer = UserSerializer(user, data=request.data, partial=True)         if serializer.is_valid():             serializer.save()             return Response(serializer.data)         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)      @csrf_exempt     def patch(self, request, pk):         user = self.get_object(pk)         serializer = UserSerializer(user, data=request.data, partial=True)         if serializer.is_valid():             serializer.save()             return Response(serializer.data)         return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)      @csrf_exempt     def delete(self, request, pk):         user = self.get_object(pk)         user.delete()         return Response(status=status.HTTP_204_NO_CONTENT) 

Looks like the problem is straight from the django-rest-framework module or maybe my os with ssl problem.

like image 227
Mathieu S Avatar asked Oct 07 '21 16:10

Mathieu S


1 Answers

Fixed the issue with PyJWT==2.1.0 and djangorestframework-simplejwt==4.8.0 in the requirements.txt:

PyJWT==2.1.0 djangorestframework-simplejwt==4.8.0 

It may be noted that PyJWT 2.2.0 (Released: Oct 7, 2021) is causing the error. So pinning PyJWT<2.2 or alternatively PyJWT==2.1.0 in personal projects is a workaround for now, but ideally this would be either pinned appropriately here:

https://github.com/jazzband/djangorestframework-simplejwt/blob/master/setup.py#L59

or handled in source code.

like image 149
pikunimohanty Avatar answered Sep 22 '22 02:09

pikunimohanty