【问题标题】:jwt.decode() got an unexpected keyword argument 'verify'jwt.decode() 得到一个意外的关键字参数“验证”
【发布时间】:2021-11-27 18:42:05
【问题描述】:

我可以使用路由 api/token 生成令牌,但之后我无法使用它。以前一切正常,但现在我从 django rest 框架中遇到了这个错误,我不知道为什么。

    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'

我遵循简单的 dango rest simple jwt 示例。

我的设置.py

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

还有我的观点.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)

看起来问题是直接来自 django-rest-framework 模块,或者可能是我的 os 存在 ssl 问题。

【问题讨论】:

  • 我在尝试请求 API 时遇到问题
  • 那个库总是有同样的问题

标签: django django-rest-framework jwt


【解决方案1】:

问题来自新版本 2.2.0(请参阅 https://github.com/jpadilla/pyjwt/issues/698

降级到 pyjwt==2.1.0 将解决此问题。

【讨论】:

    【解决方案2】:

    修复了 requirements.txt 中 PyJWT==2.1.0 和 djangorestframework-simplejwt==4.8.0 的问题:

    PyJWT==2.1.0
    djangorestframework-simplejwt==4.8.0
    

    可能会注意到 PyJWT 2.2.0(发布时间:2021 年 10 月 7 日)导致了该错误。因此,目前在个人项目中固定 PyJWT

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

    或在源代码中处理。

    【讨论】:

      【解决方案3】:

      问题出在 pyJWT 版本中。尝试将其降级到 2.0.1。

      【讨论】:

      • github.com/jpadilla/pyjwt/releases 昨天他们发布了新的 2.2.0 版本,该版本已损坏。我测试了 prev 2.1.0 - 它工作正常。
      • 确认,该版本PyJWT==2.1.0 有效!
      • 我有 PyJWT==2.1.0 但错误仍然是
      • 谢谢,你救了我。对于任何使用pipenv 命令的人将是pipenv install "pyjwt~=2.1.0"
      猜你喜欢
      • 2020-07-27
      • 2016-09-17
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 2021-03-17
      相关资源
      最近更新 更多