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也遇到了同样的问题...
- 您已经设置了
authentication_classes=[]
,因此此视图的身份验证不是 运行
- 然后您要求他们使用您的
permissions_classes
登录
现在只需从视图中删除 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',
我正在尝试使用 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也遇到了同样的问题...
- 您已经设置了
authentication_classes=[]
,因此此视图的身份验证不是 运行 - 然后您要求他们使用您的
permissions_classes
登录
现在只需从视图中删除 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',