【问题标题】:How to use cURL to send Cookies?如何使用 cURL 发送 Cookie?
【发布时间】:2013-04-06 10:19:55
【问题描述】:

我读到Send cookies with curl 有效,但不适用于我。

我有一个REST 端点:

class LoginResource(restful.Resource):
    def get(self):
        print(session)
        if 'USER_TOKEN' in session:
            return 'OK'
        return 'not authorized', 401

当我尝试访问时:

curl -v -b ~/Downloads/cookies.txt -c ~/Downloads/cookies.txt http://127.0.0.1:5000/
* About to connect() to 127.0.0.1 port 5000 (#0)
*   Trying 127.0.0.1...
* connected
* Connected to 127.0.0.1 (127.0.0.1) port 5000 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.27.0
> Host: 127.0.0.1:5000
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 401 UNAUTHORIZED
< Content-Type: application/json
< Content-Length: 16
< Server: Werkzeug/0.8.3 Python/2.7.2
< Date: Sun, 14 Apr 2013 04:45:45 GMT
<
* Closing connection #0
"not authorized"%

我的~/Downloads/cookies.txt 在哪里:

cat ~/Downloads/cookies.txt
USER_TOKEN=in

而服务器什么也没有收到:

127.0.0.1 - - [13/Apr/2013 21:43:52] "GET / HTTP/1.1" 401 -
127.0.0.1 - - [13/Apr/2013 21:45:30] "GET / HTTP/1.1" 401 -
<SecureCookieSession {}>
<SecureCookieSession {}>
127.0.0.1 - - [13/Apr/2013 21:45:45] "GET / HTTP/1.1" 401 -

我错过了什么?

【问题讨论】:

  • 我认为添加-c 选项会告诉curl 使用您的cookie 文件作为输出cookie jar,这可能不是您想要的。
  • 仅带有-b 选项的那个也不起作用,给出同样的错误:(
  • -b cookie 文件的格式不只是var=value,它应该与使用-c 编写的cookie jar 的格式相同。使用此选项转到发送 cookie 的站点,然后查看生成的文件。
  • -b cookie_file 应该是 Netscape/Mozilla 格式或纯 HTTP 标头。这是一个简单的 http 标头示例: Set-cookie: cookie_name=cookie_value;这是最低限度的。不要忘记末尾的分号。

标签: rest session curl flask session-cookies


【解决方案1】:

我在 Windows 上使用 GitBash,但没有发现对我有用。

所以我决定将我的 cookie 保存到一个名为 .session 的文件中,并使用 cat 来读取它,如下所示:

curl -b $(cat .session) http://httpbin.org/cookies

如果你好奇,我的 cookie 看起来像这样:

session=abc123

【讨论】:

    【解决方案2】:

    这对我有用:

    curl -v --cookie "USER_TOKEN=Yes" http://127.0.0.1:5000/
    

    我可以看到后端的值使用

    print(request.cookies)
    

    【讨论】:

    • 只要您永远不会将用户令牌作为 cookie 的布尔值,因为他们可以在不以这种方式登录的情况下进行身份验证。
    • 根据手册页,对于选项-b, --cookie,例如curl -b &lt;file-or-pairs&gt;,如果参数是带有'=' 符号的字符串,则按原样传递,否则将其视为从中读取cookie的文件名。
    • 多个cookie可以设置分号--cookie "key1=val1;key2=val2;..."
    • 为什么这个答案不在上面我想知道...答案排序插件有人吗?
    • 为了发送多个 cookie,我必须在; 后面加一个空格(我使用的是 mac) 例如:--cookie "key1=val1; key2=val2"
    【解决方案3】:

    curl -H @&lt;header_file&gt; &lt;host&gt;

    由于 @&lt;file&gt; 支持 curl 7.55 文件头

    echo 'Cookie: USER_TOKEN=Yes' &gt; /tmp/cookie

    curl -H @/tmp/cookie &lt;host&gt;

    docs & commit

    【讨论】:

      【解决方案4】:

      我使用的是 Debian,但无法使用波浪号作为路径。原来我是用的

      curl -c "~/cookie" http://localhost:5000/login -d username=myname password=mypassword
      

      我不得不把它改成:

      curl -c "/tmp/cookie" http://localhost:5000/login -d username=myname password=mypassword
      

      -c 创建 cookie,-b 使用 cookie

      那么我会使用例如:

      curl -b "/tmp/cookie" http://localhost:5000/getData
      

      【讨论】:

      • ~ 如果放在引号内,则不会扩展为 $HOME,在这种情况下,它将被视为文字波浪号。 ;]
      【解决方案5】:

      如果您已经在您的应用程序中发出了该请求,并且在 Google 开发工具中看到它已记录,您可以在网络选项卡中右键单击请求时使用上下文菜单中的复制 cURL 命令。复制 -> 复制为 cURL。 它将包含所有标题、cookie 等。

      【讨论】:

      • 如果您需要的 cookie 已经通过浏览器可用,则此解决方案会容易得多。 +1
      【解决方案6】:

      您可以参考https://curl.haxx.se/docs/http-cookies.html 获取有关如何使用 cookie 的完整教程。你可以使用

      curl -c /path/to/cookiefile http://yourhost/
      

      写入 cookie 文件并启动引擎并使用 cookie,您可以使用

      curl -b /path/to/cookiefile  http://yourhost/
      

      从中读取 cookie 并启动 cookie 引擎,或者如果它不是文件,它将传递给定的字符串。

      【讨论】:

      • IMO 您没有在官方文档上进行增强,这显然是泥泞 - 除了-b 标志的重载 -c 和 @ 之间的基本区别是什么987654326@他们都启动引擎并指向一个cookie文件?
      • @nhed -c 写入 cookie 文件,-b 从中读取。因此,在为登录表单发送凭据时,您可以指定 -c 将生成的 cookie 写入文件,然后您将使用 -b 读取 cookie 并将其包含在您的下一个请求中。
      • 或者使用curl -b cookiefile -c cookiefile https://yourhost/ 来读取像浏览器一样写入同一个cookie 存储。
      【解决方案7】:

      您在 cookie 文件中使用了错误的格式。正如curl documentation 所述,它使用旧的Netscape cookie 文件格式,这与Web 浏览器使用的格式不同。如果您需要手动创建 curl cookie 文件,this post 应该可以帮助您。在您的示例中,该文件应包含以下行

      127.0.0.1   FALSE   /   FALSE   0   USER_TOKEN  in
      

      有 7 个 TAB 分隔的字段,表示 domaintailmatchpathsecureexpires 名称

      【讨论】:

      • 是的,这是 cURL cookie 格式。这些是 TABS,而不是 SPACES。
      • 这应该被标记为官方答案,因为这确实解决了@daydreamer 设置失败的原因。
      猜你喜欢
      • 2011-11-03
      • 2023-03-25
      • 2023-03-15
      • 2013-05-28
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      相关资源
      最近更新 更多