我正在使用 HTML 登录表单来访问应用程序。这在浏览器中有效,但是当我尝试使用curl复制时,我得到“身份验证失败,用户名/密码错误”。我对服务器端的访问权限有限(但日志除了之前引用的消息之外不包含任何其他信息)。
使用浏览器:
表单上有 2 个字段,用户名和密码以及提交按钮。 在 Web 开发人员工具中,提交请求后,在请求/有效负载下,我只看到 2 个值。
开发者工具中报告的ENCODED字符串长度为58个字符。
请求标头字段报告内容长度值为 57 字节。
使用卷曲:
使用此命令复制包含非动态请求标头的浏览器请求,身份验证失败。
curl -v -d "username=$USER" -d "password=$PASS" \
"https://example.com/app/j_spring_security_check" \
--header @extraheadersfile \
--cookie-jar "cookiefile"
有什么不同?
我在浏览器和 Curl 请求之间看到的唯一区别(日期和 cookie 值除外)是,curl 请求标头报告的内容长度为 55 个字节。
(http 协议、方法、用户代理、accept-* 全部匹配)
在这两种情况下,用户名和密码的值均输入正确。
我怀疑问题出在 POST 负载上/数据的编码方式可能存在一些差异,但我看不到 57 个字节来自哪里(curl Content-length: 55 / browser Content-length : 57 / 浏览器负载,url 编码为 58 个字符)。
通常,处理cookie时,需要在同一个文件中同时启用写入和读取。
您可以像这样修复代码:
curl --cookie-jar "cookiefile" --cookie "cookiefile" .......
或
curl -b "cookiefile" -c "cookiefile" .......