如何卷曲已验证的Django应用程序?

如何卷曲已验证的Django应用程序?,django,rest,authentication,curl,Django,Rest,Authentication,Curl,我有几个API要用cURL测试。我试着做一个如下的GET: curl --user username:password --request GET http://my_domain/get_result/52d6428f3ea9a008358ad2d8/ 在服务器上,它显示了一个“302”(这意味着重定向,对吗?)。我猜它被重定向到了“login/”页面 正确的方法是什么 编辑:我尝试了: curl -c cookies.txt -b cookies.txt -L -d @login_form

我有几个API要用cURL测试。我试着做一个如下的GET:

curl --user username:password --request GET http://my_domain/get_result/52d6428f3ea9a008358ad2d8/
在服务器上,它显示了一个“302”(这意味着重定向,对吗?)。我猜它被重定向到了“login/”页面

正确的方法是什么

编辑:我尝试了:

curl -c cookies.txt -b cookies.txt -L -d @login_form.txt http://my_domain/login/

其中login\u form.txt包含“username=username&password=password&this\u是\u login\u form=1”。不起作用。没有生成cookies.txt文件。而且没有登录发生。您能告诉我如何使用cURL登录Django吗?

在cURL请求中传递username:password只适用于HTTP身份验证,而现在大多数网站都不这么做。相反,您必须发布到登录页面,获取cookie,然后在请求所需页面时将其传回。

这里是一个完整编码的答案。解决方案的理念是:

  • 您必须首先使用GET访问登录页面才能生成Cookie文件
  • 然后从cookies文件中解析CSRF令牌
  • 并使用POST请求进行登录,使用
    -d
    传递数据
  • 之后,您可以始终使用数据中的CSRF令牌(
    $DJANGO_令牌
    )或自定义的
    X-CSRFToken
    头执行任何请求。要注销,只需删除cookies文件

    请注意,您需要一个referer(
    -e
    )来满足Django的CSRF检查

    LOGIN\u URL=https://yourdjangowebsite.com/login/
    您的_USER='username'
    你的密码
    COOKIES=COOKIES.txt
    CURL\u BIN=“CURL-s-c$COOKIES-b$COOKIES-e$LOGIN\u URL”
    echo-n“Django身份验证:获取csrftoken…”
    $CURL\u BIN$LOGIN\u URL>/dev/null
    DJANGO_TOKEN=“csrfmiddlewaretoken=$(grep csrftoken$COOKIES | sed's/^.*csrftoken\s*/')”
    echo-n“执行登录…”
    $CURL_BIN\
    -d“$DJANGO_令牌和用户名=$YOUR_用户和密码=$YOUR_通行证”\
    -X POST$LOGIN\u URL
    echo-n“登录时执行某些操作…”
    $CURL_BIN\
    -d“$DJANGO_代币和…”\
    -X柱https://yourdjangowebsite.com/whatever/
    回显“注销”
    rm$饼干
    
    我有一个稍微安全一点的代码版本,它使用一个文件来提交帖子数据,作为GitHub的要点:


    关于Django的CSRF令牌的有趣背景阅读正在进行中。

    实际上@Paterino的答案是正确的,但它不会在sed的每个实现上都起作用。相反,
    sed's/^.*csrftoken\s*/')
    我们可以使用更老式的
    sed's/^.*csrftoken[[:blank:]*/')
    。MacOSXs curl不使用转义,因此
    \n\t\s
    根本不起作用。

    要在get请求中使用令牌,请使用

    $CURL_BIN \
        -H "$DJANGO_TOKEN" \
        -X GET https://yourdjangowebsite.com/whatever/
    

    我尝试将-d与-X GET一起使用,但是它导致服务器端出现奇怪的套接字行为(Heruko H18错误)。

    我不得不说这挽救了我的一天。尽管目前没有referer,它仍然可以正常工作。“sed的/^.*csrftoken\s*/'”在csrf值之前添加了一个额外的空格。这就是为什么我使用了“awk{'print$7'}”。在macOS上,我在令牌前面有一个额外的选项卡,所以我按照中的建议将
    \s
    替换为
    [[:space:]
    。此外,我还必须修改登录URL,因为我在MacOs上获得了302。使用
    sed的/^.*csrftoken[[:blank:][]*/')
    对我很有效。现在我得到了
    CSRF失败:CSRF令牌丢失或不正确。
    。有什么好办法吗?一旦你有足够的时间,你就可以在任何帖子上发表文章了。也请检查这个。谢谢你指出这一点。答案是关于一般方法,实现细节参考了sed的GNU版本(从Linux开始),只是一个示例。我有一个要点可以让GNU也成为Mac电脑的默认配置:Nice看起来是完美的解决方案,我稍后会尝试。我的帖子或多或少是对你的答案的延伸,也是对其他像我一样有困难的人的延伸。