Django 休息框架 jwt {"detail": "You do not have permission to perform this action."}

Django rest framework jwt {"detail": "You do not have permission to perform this action."}

我正在尝试使用 django-rest-framework 和 django-rest-framework-jwt 发出请求,但我得到的响应是 detail": "You do not have permission to perform this action."

views.py

class Test(generics.RetrieveAPIView):
    permission_classes = [IsAuthenticated]
    authentication_classes = []
    queryset = User.objects.all()
    def get(self, request):
        return response.Response({"test": "Test "}, status=status.HTTP_200_OK)

urls.py

from rest_framework_jwt.views import obtain_jwt_token, refresh_jwt_token
from .views import Test
urlpatterns = [
    path('', Test.as_view(), name='test'),
    path('token/', obtain_jwt_token, name='token_obtain_pair'),
    path('token/refresh/', refresh_jwt_token, name='token_refresh'),
]

settings.py

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}
JWT_AUTH = {
    'JWT_ENCODE_HANDLER':
    'rest_framework_jwt.utils.jwt_encode_handler',
    'JWT_DECODE_HANDLER':
    'rest_framework_jwt.utils.jwt_decode_handler',
    'JWT_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_payload_handler',
    'JWT_PAYLOAD_GET_USER_ID_HANDLER':
    'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',
    'JWT_RESPONSE_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_response_payload_handler',
    'JWT_SECRET_KEY': SECRET_KEY,
    'JWT_GET_USER_SECRET_KEY': None,
    'JWT_PUBLIC_KEY': None,
    'JWT_PRIVATE_KEY': None,
    'JWT_ALGORITHM': 'HS256',
    'JWT_VERIFY': True,
    'JWT_VERIFY_EXPIRATION': True,
    'JWT_LEEWAY': 0,
    'JWT_EXPIRATION_DELTA': timedelta(days=5),
    'JWT_AUDIENCE': None,
    'JWT_ISSUER': None,
    'JWT_ALLOW_REFRESH': True,
    'JWT_REFRESH_EXPIRATION_DELTA': timedelta(days=7),
    'JWT_AUTH_HEADER_PREFIX': 'JWT',
    'JWT_AUTH_COOKIE': None,
}

以及我提出的要求: >curl -X GET http://127.0.0.1:8000/users/ -H 'Authorization: Token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxMCwidXNlcm5hbWUiOiJoYXNhbm1iaWxhbDE5OThAZ21haWwuY29tIiwiZXhwIjoxNjUxNTkxMDYxLCJlbWFpbCI6Imhhc2FubWJpbGFsMTk5OEBnbWFpbC5jb20iLCJvcmlnX2lhdCI6MTY1MTE1OTA2MX0.bvmtH6mnItBjwKkvaNU5eMXlEyk2ZAytMWzhEE_Ibhs'

注:我用过django-rest-framework-simplejwt也遇到了同样的问题...

  1. 您已经设置了 authentication_classes=[],因此此视图的身份验证不是 运行
  2. 然后您要求他们使用您的 permissions_classes
  3. 登录

现在只需从视图中删除 authentication_classes = []。您的默认权限也需要身份验证,因此也可以删除该行。

根据您在这里的用法,您可能应该使用 APIView 而不是泛型。如果您打算使用泛型的特性(并手动正确构建路由),请坚持下去。

class Test(APIView):
    # use default permission_classes in REST_FRAMEWORK
    # use default authentication_classes in REST_FRAMEWORK

    def get(self, request):
        return Response({"data": "Test"})

要回答您的新问题,在 rest_framework_jwt 包的 referring to the documentation 之后,您需要将令牌发送为 Authorization: JWT {token}

如果这不是正确的文档或包,请将 link 连同使用 Token 的位置一起发送到正确的文档或包(实际上 simple_jwt 有效,而不是这个包)。

在您的设置文件中,您实际上覆盖了所有默认设置,而您只需要更改那些您想要更改的设置。在此列表的底部,我看到了:

    'JWT_AUTH_HEADER_PREFIX': 'JWT',