Django Rest框架&x2B;React JWT身份验证,403在受保护视图上禁止
我正试图用DRF+react创建一个CRUD网站,我在某种程度上遵循了本教程的认证要求 (由于我使用DRF并完全独立地进行反应,因此存在一些差异) 身份验证很好,我已经可以登录、注销和注册,但是任何需要“IsAuthenticated”权限的视图都会给我一个403禁止,我也尝试通过postman使用标题获取数据: 接受:application/json 授权:JWT“myaccesstoken” 但我也得到了一个403,上面写着“detail”:“您没有执行此操作的权限。” 下面是一些代码Django Rest框架&x2B;React JWT身份验证,403在受保护视图上禁止,django,reactjs,django-rest-framework,jwt-auth,Django,Reactjs,Django Rest Framework,Jwt Auth,我正试图用DRF+react创建一个CRUD网站,我在某种程度上遵循了本教程的认证要求 (由于我使用DRF并完全独立地进行反应,因此存在一些差异) 身份验证很好,我已经可以登录、注销和注册,但是任何需要“IsAuthenticated”权限的视图都会给我一个403禁止,我也尝试通过postman使用标题获取数据: 接受:application/json 授权:JWT“myaccesstoken” 但我也得到了一个403,上面写着“detail”:“您没有执行此操作的权限。” 下面是一些代码 S
Settings.py
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication', (#I've already tried commenting out basic and session auth)
)
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
'REFRESH_TOKEN_LIFETIME': timedelta(days=14),
'ROTATE_REFRESH_TOKENS': True,
'BLACKLIST_AFTER_ROTATION': True,
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'VERIFYING_KEY': None,
'AUTH_HEADER_TYPES': ('JWT ',),
'USER_ID_FIELD': 'username',
'USER_ID_CLAIM': 'user_id',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
}
CORS_ORIGIN_ALLOW_ALL = True
以及受保护的视图
views.py
class PostList(generics.ListCreateAPIView):
permission_classes = (IsAuthenticated,) (#I've tried with or without this)
authentication_classes = () (# if i take this out i get a 401 insteand of a 403)
queryset = Post.objects.all()
serializer_class = PostSerializer
我没有显示任何react代码,因为我认为问题出在DRF部分,因为我也无法在PostMan上成功地发出GET请求,如果我将设置更改为AllowAny,我可以在两个位置发出GET请求,这很好我也有同样的问题。对于默认身份验证(特别是REST\u FRAMEWORK\u simplejwt),REST\u框架设置似乎不起作用。我不知道为什么 尝试直接将JWTAuthentication类导入您的authentication\u classes元组,如:
来自rest\u framework\u simplejwt.authentication导入JWTAuthentication
类PostList(generics.ListCreateAPIView):
权限\类=(已验证,)
认证\类=(JWTAuthentication)
queryset=Post.objects.all()
序列化程序\u类=后序列化程序
乍一看,我发现您与本教程的区别在于,在'AUTH\u HEADER\u TYPES'
下,您在'JWT'
中添加了一个空格,而它们没有包含空格。不是100%确定这是否会解决您的问题,但据我所知,HTTP头中的空格确实很重要。只是更改了它,但我得到了相同的错误嘿!感谢您回答我的老问题,我已经放弃了那个项目,所以我没有那个旧代码,但我现在正在做另一个尝试相同身份验证的项目,我刚刚通过使用dj rest auth包(可选地随简单jwt集成而来)实现了这一点!。