如何卷曲已验证的Django应用程序?
我有几个API要用cURL测试。我试着做一个如下的GET:如何卷曲已验证的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
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,然后在请求所需页面时将其传回。这里是一个完整编码的答案。解决方案的理念是:
-d
传递数据$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看起来是完美的解决方案,我稍后会尝试。我的帖子或多或少是对你的答案的延伸,也是对其他像我一样有困难的人的延伸。