如何cURL经过身份验证的Django应用程序?

Sre*_*nan 17 authentication django rest curl

我有一些我想用cURL测试的API.我尝试按如下方式进行GET:

curl --user username:password --request GET http://my_domain/get_result/52d6428f3ea9a008358ad2d8/
Run Code Online (Sandbox Code Playgroud)

在服务器上,它显示'302'(这意味着重定向,对吧?).我猜它被重定向到'login /'页面.

完成这项工作的正确方法是什么?

编辑:我试过:

curl -c cookies.txt -b cookies.txt -L -d @login_form.txt http://my_domain/login/
Run Code Online (Sandbox Code Playgroud)

其中login_form.txt包含"username = username&password = password&this_is_the_login_form = 1".不行.没有生成cookies.txt文件.并且没有登录发生.你能告诉我你是如何使用cURL登录Django的吗?

Pet*_*ino 40

这是一个完全编码的答案.解决方案的想法是:

  1. 你必须先用GET访问登录页面才能获得生成的cookie文件,
  2. 然后从cookie文件中解析出CSRF令牌
  3. 并使用POST请求进行登录,并使用-d.

之后,您可以始终使用data($DJANGO_TOKEN)中的CSRF令牌或自定义X-CSRFToken标头执行任何请求.要注销,只需删除cookie文件即可.

请注意,您需要一个referer(-e)来使Django的CSRF检查更快乐.

LOGIN_URL=https://yourdjangowebsite.com/login/
YOUR_USER='username'
YOUR_PASS='password'
COOKIES=cookies.txt
CURL_BIN="curl -s -c $COOKIES -b $COOKIES -e $LOGIN_URL"

echo -n "Django Auth: get csrftoken ..."
$CURL_BIN $LOGIN_URL > /dev/null
DJANGO_TOKEN="csrfmiddlewaretoken=$(grep csrftoken $COOKIES | sed 's/^.*csrftoken\s*//')"

echo -n " perform login ..."
$CURL_BIN \
    -d "$DJANGO_TOKEN&username=$YOUR_USER&password=$YOUR_PASS" \
    -X POST $LOGIN_URL

echo -n " do something while logged in ..."
$CURL_BIN \
    -d "$DJANGO_TOKEN&..." \
    -X POST https://yourdjangowebsite.com/whatever/

echo " logout"
rm $COOKIES
Run Code Online (Sandbox Code Playgroud)

我有一个稍微更安全的代码版本,它使用一个文件来提交POST数据,作为GitHub上的Gist:django-csrftoken-login-demo.bash

关于Django的CSRF令牌的有趣背景阅读在docs.djangoproject.com上.

  • "sed的/^.*csrftoken\s*//'"在csrf值之前放了一个额外的空格.这就是为什么,我使用"awk {'print $ 7'}". (3认同)