【问题标题】:AllowAny CreateAPIView returns 401 for unauthenticated usersAllowAny CreateAPIView 为未经身份验证的用户返回 401
【发布时间】:2021-09-12 10:52:45
【问题描述】:

我将 DRF 与 djangorestframework-simplejwt 包一起使用。在我的 settings.py 中:

INSTALLED_APPS = [
    ...
    'rest_framework',
    ...
]

...

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTTokenUserAuthentication',
    ),
}

SWAGGER_SETTINGS = {
   'SECURITY_DEFINITIONS': {
      'Bearer': {
            'type': 'apiKey',
            'name': 'Authorization',
            'in': 'header',
            'description': 'E.g. \'Bearer jwt.token.here\''
      }
   }
}

在我的应用的 views.py 中:


...

class PublicCreateView(generics.CreateAPIView):
    """
    Should be available for unauthenticated users
    """
    serializer_class = PublicThingSerializer

    def post(self, request, *args, **kwargs):
        return Response("It works!", 200)
...

但由于某种原因,此视图会为未经身份验证的用户返回 401 响应。我尝试了很多东西,我得到的最好的结果是当我从我的settings.py 中完全删除REST_FRAMEWORK 配置时,响应代码更改为403 forbidden。有什么想法吗?

【问题讨论】:

  • 清理您的 cookie 并重试

标签: django django-rest-framework jwt django-rest-framework-simplejwt


【解决方案1】:

正如 MojixCoder 在评论中提到的那样,清理 cookie 可能已经解决了这个问题,但是这一次,经过几个小时的调试,结果发现我的问题实际上与 urls.py 有关其中声明(简化):

from . import views

urlpatterns = [
    path("something/", views.SomethingViewSet()),

    ...

    path("something/more/", views.PublicCreateView.as_view())
]

问题在于,在将请求路由到 url /something/more/ 时,Django 实际上使用了第一个匹配规则(完全可以理解和预期的行为),它在 permission_classes 中设置了 rest_framework.permissions.IsAuthenticated。此行为在How Django processes a request 部分下的 URL 调度程序的 Django 文档中进行了描述,第 3 点:

  1. Django 按顺序运行每个 URL 模式,并在第一个匹配请求的 URL 的处停止,与 path_info 匹配。

希望它能节省一些人的时间。由于 API 只返回了一个通用的 401 答案,这令人惊讶地难以弄清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-25
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2020-11-15
    • 2019-09-13
    • 1970-01-01
    相关资源
    最近更新 更多