Django Rest Framework + React JWT 身份验证,403 Forbidden on protected views

Posted

技术标签:

【中文标题】Django Rest Framework + React JWT 身份验证,403 Forbidden on protected views【英文标题】:Django Rest Framework + React JWT authentication, 403 Forbidden on protected views 【发布时间】:2020-08-29 20:53:16 【问题描述】:

我正在尝试使用 DRF + react 制作一个 CRUD 网站,我在某种程度上遵循了本教程进行身份验证

https://hackernoon.com/110percent-complete-jwt-authentication-with-django-and-react-2020-iejq34ta (有一些不同,因为我完全分开使用 DRF 和 React)

身份验证很好,我已经可以登录、注销和注册,但是任何需要“IsAuthenticated”权限的视图都会给我一个 403 Forbidden,我也尝试使用标题通过邮递员获取数据: 接受:应用程序/json 授权:JWT“myaccesstoken” 但我也收到带有“详细信息”的 403:“您无权执行此操作。”

这是一些代码

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

我没有显示任何反应代码,因为我认为问题出在 DRF 部分,因为我也无法在 PostMan 上成功发出 GET 请求,如果我将设置更改为 AllowAny,我可以发出 GET 请求在这两个地方都很好

【问题讨论】:

乍一看,一旦我看到你所拥有的内容与教程的不同之处在于,在'AUTH_HEADER_TYPES' 下,你在'JWT ' 下放置了一个空格,而他们没有在其中包含空格。不是 100% 确定这是否会解决您的问题,但据我了解,HTTP 标头中的空格确实很重要。 刚改了,还是一样的错误 【参考方案1】:

我也有同样的问题。似乎用于默认身份验证的 REST_FRAMEWORK 设置(特别是 rest_framework_simplejwt)不起作用。不知道为什么……

尝试在您的 authentication_classes 元组中直接导入 JWTAuthentication 类,例如:

from rest_framework_simplejwt.authentication import JWTAuthentication
class PostList(generics.ListCreateAPIView):
    permission_classes = (IsAuthenticated,)
    authentication_classes = (JWTAuthentication)
    queryset = Post.objects.all()
    serializer_class = PostSerializer

【讨论】:

嘿!感谢您回答我的老问题,我已经放弃了那个项目,所以我没有那个旧代码,但我现在正在研究另一个尝试相同身份验证的代码,我刚刚设法通过使用 dj-rest-auth 包,它可以选择与 simple-jwt 集成!。

以上是关于Django Rest Framework + React JWT 身份验证,403 Forbidden on protected views的主要内容,如果未能解决你的问题,请参考以下文章

Django中rest_framework的APIView,序列化组件和视图组件

在 django-rest-framework 中插入 django-allauth 作为端点

Django中rest_framework的认证组件,权限组件,频率组件,序列化组件的最简化版接口

Django Rest Framework 反向和 SimpleRouter

Django Rest Framework组件:解析器JSONParserFormParserMultiPartParserFileUploadParser

根据请求类型更改 Django REST Framework ModelSerializer 中的字段?