1

通过 postman 发起 POST 请求注册新用户返回 403 Forbidden,CSRF 验证失败。请求中止... 根据 DRF文档knox auth 文档,我已正确设置所有内容。即使我的 DEFAULT_AUTHENTICATION_CLASSES 中没有它,Django 的 SessionAuthentication 似乎也被激活了。我已经尝试了所有我能找到的潜在解决方案,但没有任何效果。该应用程序是一个带有 React 前端的 Django rest api。任何帮助将不胜感激。

身份验证和权限设置

'DEFAULT_AUTHENTICATION_CLASSES': (
    'knox.auth.TokenAuthentication',
),

'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.AllowAny',
),

url 调用视图 as_view

re_path('auth/register', Register.as_view(), name='register'),

基于类的注册视图扩展 APIView 应该处理 csrf

class Register(APIView):
    """User Registration API View"""

    def post(self, request, *args, **kwargs):
        if request.method == 'POST':
            serializer = RegistrationSerializer(data=request.data)
            data = {}
            if serializer.is_valid():
                user = serializer.save()
                data['response'] = 'Account registered successfully'
                data['firstName'] = user.first_name
                data['lastName'] = user.last_name
                data['email'] = user.email
                data['token'] = AuthToken.objects.get(user=user).key
                return Response(data, status=status.HTTP_201_CREATED)

            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

堆栈跟踪错误

Forbidden (CSRF cookie not set.): /api/account/auth/register
[20/Jun/2020 12:15:14] "POST /api/account/auth/register HTTP/1.1" 403 2864

更新 我发现了问题并将其添加为下面的答案

4

1 回答 1

0

对于其他可能发现自己处于这种情况的人,我希望这可以有所帮助。似乎因为我正在将 React 与 Django 集成并使用 Reacts 路由器,所以 Django url 必须放在基本 urls.py 文件中的 React url 之前,否则 React 的路由器接受请求并通过其路由器运行它,找不到任何匹配的 url 和抛出一个错误,因此它永远不会通过 Django api 端点运行。这解释了为什么当 Django 的 SessionAuthentication 被 React 路由器击中时,我收到 CSRF 错误。在所有测试之后,答案就像交换两行一样简单。

以前的投掷错误

urlpatterns = [
    # Admin portal
    re_path('admin/', admin.site.urls),

    # React UI Entry
    re_path('', include('frontend.urls'), name='frontend'),

    # Rest API Urls
    re_path('api/account/', include('account.api.urls'), name='account_api'),
]

重构无错误

urlpatterns = [
    # Admin portal
    re_path('admin/', admin.site.urls),

    # Rest API Urls
    re_path('api/account/', include('account.api.urls'), name='account_api'),

    # React UI Entry
    re_path('', include('frontend.urls'), name='frontend'),
]
于 2020-06-20T18:14:06.487 回答