我有几个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的吗?
5条答案
按热度按时间pxy2qtax1#
下面 是 一 个 完整 的 编码 答案 。 解决 方案 的 思想 是 :
1.您 必须 首先 使用 GET 访问 登录 页面 以 生成 cookie 文件 ,
1.然后 从 Cookie 文件 中 解析 出 CSRF 标记
1.并 使用 POST 请求 进行 登录 , 使用
-d
传递 数据 。之后 , 您 可以 使用 数据 (
$DJANGO_TOKEN
) 中 的 CSRF 令牌 或 自 定义 的X-CSRFToken
头 执行 任何 请求 。 要 注销 , 只需 删除 cookie 文件 。请 注意 , 您 需要 一 个 referer (
-e
) 来 使 Django 的 CSRF 检查 满意 。中 的 每 一 个
我 有 一 个 稍微 安全 一些 的 代码 版本 , 它 使用 一 个 文件 来 提交 POST 数据 , 作为 GitHub 上 的 一 个 Gist :django-csrftoken-login-demo.bash 的 最 大 值
关于 Django 的 CSRF 令牌 的 有趣 背景 阅读 在 docs.djangoproject.com 上 。
esbemjvw2#
在curl请求中传递username:password只适用于HTTP认证,现在大多数网站都不这么做。相反,你必须在登录页面上发帖,获取cookie,然后在请求你想要的页面时将其传递回来。
rekjcdws3#
实际上,@Paterino的答案是正确的,但它并不适用于sed的每一个实现。我们可以使用
sed 's/^.*csrftoken\s*//')
来代替sed 's/^.*csrftoken[[:blank:]]*//')
,这是一个更老式的方法。MacOSXs的curl不使用转义,所以\n\t\s
根本不起作用。p4tfgftt4#
若要将令牌与get请求一起使用,请使用
我尝试使用-d和-X GET,但是它导致服务器端出现奇怪的套接字行为(Heruko H18错误)。
nwsw7zdq5#
我正在使用Django 4.1.2,并尝试@Paterino方法,发现了一些变化,使其工作(但我没有足够的声誉评论,所以写了另一个答案)。
首先,如果生成的cookies.txt文件是空的,那么你必须确保生成了csrf cookie。
现在,登录后cookie.txt发生了变化,所以你必须以同样的方式重新计算DJANGO_TOKEN变量:
从这里开始,方法不会改变。