代码之家  ›  专栏  ›  技术社区  ›  Saqib Ali

为什么在从网站执行jQuery Ajax PUT时会出现CSRF错误?从命令行工作正常。

  •  3
  • Saqib Ali  · 技术社区  · 12 年前

    我创建了一个Django Rest Framework API,允许我通过命令行成功运行PUT请求,如下所示:

    % curl -X PUT -u myUser:myPassword http://127.0.0.1:3001/api/myEndpoint/64/
    {"id": 64, "myAttr1": "Blah1", "myAttr2": "Blah2"}
    

    在我的web应用程序中,我有以下JQueryAJAX,如果我以 myUser :

    $.ajax(
        {
            url: "/api/myEndpoint/64/",
            type: "PUT",
            success: function( data ) 
            {
                console.log("Do Something Here");
            }
        }
    );
    

    然而,当这个.ajax命令运行时,我在Chrome开发控制台中看到以下错误:

    PUT http://127.0.0.1:3001/api/myEndpoint/64/ 403 (FORBIDDEN) 
    

    经过进一步调查,我在运行时也发现了Django警告。ajax:

    WARNING [django.request:99] Forbidden (CSRF token missing or incorrect.): /api/myEndpoint/64/
    

    为什么从命令行而不是从我的web浏览器执行此操作?我该怎么做?我不完全理解CSRF的工作原理。我很想让它发挥作用。

    作为参考,这里是views.py的摘录:

    class MyEndPoint(mixins.UpdateModelMixin, generics.GenericAPIView):
        queryset = MyObject.objects.all()
        serializer_class = MyObjectSerializer
    
        def put(self, request, *args, **kwargs):
            logger.debug("myID = %s" % kwargs["myID"])
            ...
    

    以下是urls.py的摘录:

    url(r'^api/myEndpoint/(?P<myID>\d+)/?$', views.MyEndPoint.as_view()),
    
    1 回复  |  直到 12 年前
        1
  •  4
  •   Tom Christie    12 年前

    在您使用的命令行示例中 -u myUser:myPassword ,因此您使用的是HTTP基本身份验证。

    在AJAX示例中,您没有这样做,相反,身份验证是隐式的基于会话的。这意味着您需要包含CSRF令牌。

    请查看如何包含CSRF令牌的文档, here here .