【问题标题】:csrf_exempt set but CSRF Failed: Referer checking failed - no Referercsrf_exempt 设置但 CSRF 失败:Referer 检查失败 - 没有Referer
【发布时间】:2021-05-19 10:42:35
【问题描述】:

我有一个后端 API,它在 django 中并部署在 Google Endpoint 上。 我有一个向我的数据库插入数据的发布请求。

我创建了一个脚本来使用这个端点,但是我得到了这个错误:

{"detail":"CSRF 失败:Referer 检查失败 - 没有Referer。"}

关于帖子,我在课堂上添加了 crsf_exempt 装饰器,但它没有改变。
我尝试通过两种方式添加装饰器:

class AddUser(APIView):
    """ Create user and company from csv """

    @method_decorator(csrf_exempt)
    def post(self, request):


@method_decorator(csrf_exempt, name='dispatch')
class AddUser(APIView):
    """ Create user and company from csv """

    def post(self, request):

但都失败了。

这是我联系端点的方式:

resp = requests.request(
    method, url,
    headers={'Authorization': 'Bearer {}'.format(
        open_id_connect_token)}, **kwargs)

有什么想法吗? 谢谢


编辑

所以我尝试将身份验证类添加到我的视图中,但这似乎是个坏主意。这对我来说真的很麻烦。

我试图让 csrftoken 这样做:

        client = requests.session()
        # Retrieve the CSRF token first
        client.get(url)  # sets cookie
        print(client.cookies)
        if 'csrftoken' in client.cookies:
            # Django 1.6 and up
            csrftoken = client.cookies['csrftoken']
        else:
            # older versions
            csrftoken = client.cookies

问题是,我正在使用 IAP 来保护我的 API,我没有任何 csrftoken cookie,但我确实有一个看起来像这样的东西:

如何使用它向我的 API 发出 post 请求?

【问题讨论】:

    标签: django csrf google-cloud-endpoints


    【解决方案1】:

    所以这发生在我身上,因为我没有为我的通用视图设置任何 authentication_classes
    如果未设置此选项,Django 会自动使用 SessionBackend,这需要 csrf 令牌。
    我通过将其添加到我的视图来修复它:authentication_classes = [ModelBackend, GoogleOAuth2]

    【讨论】:

      【解决方案2】:

      @Kimor - 你可以尝试在你的 urls.py 中这样做

       from django.views.decorators.csrf import csrf_exempt
      
      url('^test/$', csrf_exempt(views.TestView.as_view())),
      

      APIView 类上定义的 get 和 post 方法只是告诉 DRF 实际视图应该如何表现,但 Django 路由器期望的视图方法在您调用 TestView.as_view() 之前不会实际实例化。

      • 来源

      Django REST Framework CSRF Failed: CSRF cookie not set

      【讨论】:

      • 我有两个端点,我在我的路径上这样做了:path('my-path', csrf_exempt(AddUser.as_view()), name='my-path'),但错误是仍在发生
      猜你喜欢
      • 1970-01-01
      • 2016-07-04
      • 2015-09-26
      • 2018-01-02
      • 2016-04-12
      • 2012-02-21
      • 1970-01-01
      • 2021-01-18
      • 2018-06-19
      相关资源
      最近更新 更多