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

时间:2014-01-23 11:13:41

标签: django rest authentication curl

我想用cURL测试一些API。我尝试按如下方式进行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_form.txt包含“username = username& password = password& this_is_the_login_form = 1”。不行。没有生成cookies.txt文件。并且没有登录发生。你能告诉我你是如何使用cURL登录Django的吗?

4 个答案:

答案 0 :(得分:38)

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

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

    请注意,您需要一个引用程序(-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
    

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

在curl请求中传递用户名:密码仅适用于HTTP身份验证,这不是大多数网站最近验证的方式。相反,您必须发布到登录页面,获取cookie,然后在请求所需页面时将其传回。

答案 3 :(得分:0)

要在获取请求中使用令牌,请使用

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

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