如何cURL一个经过认证的Django应用?

rjjhvcjd  于 2022-11-13  发布在  Go
关注(0)|答案(5)|浏览(215)

我有几个API想用cURL来测试。我试着做一个GET,如下所示:

curl --user username:password --request GET http://my_domain/get_result/52d6428f3ea9a008358ad2d8/

在服务器上,它显示了一个'302'(这意味着重定向,对不对?)。我猜它重定向到'登录/'页。
完成这项工作的正确方法是什么?

编辑:我尝试:

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的吗?

pxy2qtax

pxy2qtax1#

下面 是 一 个 完整 的 编码 答案 。 解决 方案 的 思想 是 :
1.您 必须 首先 使用 GET 访问 登录 页面 以 生成 cookie 文件 ,
1.然后 从 Cookie 文件 中 解析 出 CSRF 标记
1.并 使用 POST 请求 进行 登录 , 使用 -d 传递 数据 。
之后 , 您 可以 使用 数据 ( $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

中 的 每 一 个
我 有 一 个 稍微 安全 一些 的 代码 版本 , 它 使用 一 个 文件 来 提交 POST 数据 , 作为 GitHub 上 的 一 个 Gist :django-csrftoken-login-demo.bash 的 最 大 值
关于 Django 的 CSRF 令牌 的 有趣 背景 阅读 在 docs.djangoproject.com 上 。

esbemjvw

esbemjvw2#

在curl请求中传递username:password只适用于HTTP认证,现在大多数网站都不这么做。相反,你必须在登录页面上发帖,获取cookie,然后在请求你想要的页面时将其传递回来。

rekjcdws

rekjcdws3#

实际上,@Paterino的答案是正确的,但它并不适用于sed的每一个实现。我们可以使用sed 's/^.*csrftoken\s*//')来代替sed 's/^.*csrftoken[[:blank:]]*//'),这是一个更老式的方法。MacOSXs的curl不使用转义,所以\n\t\s根本不起作用。

p4tfgftt

p4tfgftt4#

若要将令牌与get请求一起使用,请使用

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

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

nwsw7zdq

nwsw7zdq5#

我正在使用Django 4.1.2,并尝试@Paterino方法,发现了一些变化,使其工作(但我没有足够的声誉评论,所以写了另一个答案)。
首先,如果生成的cookies.txt文件是空的,那么你必须确保生成了csrf cookie。
现在,登录后cookie.txt发生了变化,所以你必须以同样的方式重新计算DJANGO_TOKEN变量:

DJANGO_TOKEN="csrfmiddlewaretoken=$(grep csrftoken $COOKIES | sed 's/^.*csrftoken\s*//')"

从这里开始,方法不会改变。

相关问题