ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 cURL 发送 Cookie?

我读到 sending 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;这是最低限度的。不要忘记最后的分号。

F
Francisco

这对我有用:

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

我可以看到后端使用的值

print(request.cookies)

只要您永远不会将用户令牌作为 cookie 的布尔值,因为他们可以在不以这种方式登录的情况下验证自己。
根据手册页,对于选项 -b, --cookie,例如 curl -b <file-or-pairs>,如果参数是具有 '=' 符号的字符串,则按原样传递,否则将其视为从中读取 cookie 的文件名。
可以使用分号 --cookie "key1=val1;key2=val2;..." 设置多个 cookie
为了发送多个 cookie,我必须在 ; 之后放置一个空格(我使用的是 mac)例如:--cookie "key1=val1; key2=val2"
s
simhumileco

您可以参阅 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-b 他们都启动引擎并指向一个 cookie 文件?
@nhed -c 写入 cookie 文件,-b 从中读取。因此,在为登录表单发送凭据时,您将指定 -c 将生成的 cookie 写入文件,然后您将使用 -b 读取 cookie 并将其包含在您的下一个请求中。
或者像浏览器一样执行 curl -b cookiefile -c cookiefile https://yourhost/ 来读取 写入同一个 cookie 存储。
y
yurloc

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

127.0.0.1   FALSE   /   FALSE   0   USER_TOKEN  in

有 7 个制表符分隔的字段,表示域、尾匹配、路径、安全、过期、名称、值。


是的,这是 cURL cookie 格式。这些是标签而不是空格。
这应该被标记为官方答案,因为这真正解决了@daydreamer 设置失败的原因。
a
afirth

curl -H @<header_file> <host>

由于 @<file> 支持来自文件的 curl 7.55 标头

echo 'Cookie: USER_TOKEN=Yes' > /tmp/cookie

curl -H @/tmp/cookie <host>

docs & commit


F
Flip

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


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

我正在使用 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,在这种情况下,它将被视为文字波浪号。 ;]
h
hvescovi

另一个使用 json 的解决方案。

卷曲:

curl -c /tmp/cookie -X POST -d '{"chave":"email","valor":"hvescovi@hotmail.com"}' -H "Content-Type:application/json" localhost:5000/set

curl -b "/tmp/cookie" -d '{"chave":"email"}' -X GET -H "Content-Type:application/json"  localhost:5000/get

curl -b "/tmp/cookie" -d '{"chave":"email"}' -X GET -H "Content-Type:application/json" localhost:5000/delete

蟒蛇代码:

from flask import Flask, request, session, jsonify
from flask_session import Session

app = Flask(__name__)

app.secret_key = '$#EWFGHJUI*&DEGBHYJU&Y%T#RYJHG%##RU&U'
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)

@app.route('/')
def padrao():
    return 'backend server-side.'
    
@app.route('/set', methods=['POST'])
def set():
    resposta = jsonify({"resultado": "ok", "detalhes": "ok"})
    dados = request.get_json()  
    try:  
        if 'chave' not in dados: # não tem o atributo chave?
            resposta = jsonify({"resultado": "erro", 
                            "detalhes": "Atributo chave não encontrado"})
        else:
            session[dados['chave']] = dados['valor']
    except Exception as e:  # em caso de erro...
        resposta = jsonify({"resultado": "erro", "detalhes": str(e)})

    resposta.headers.add("Access-Control-Allow-Origin", "*")
    return resposta  

@app.route('/get')
def get():
    try:
        dados = request.get_json()  
        retorno = {'resultado': 'ok'}
        retorno.update({'detalhes': session[dados['chave']]}) 
        resposta = jsonify(retorno)
    except Exception as e:  
        resposta = jsonify({"resultado": "erro", "detalhes": str(e)})
    
    resposta.headers.add("Access-Control-Allow-Origin", "*")
    return resposta 

@app.route('/delete')
def delete():
    try:
        dados = request.get_json()  
        session.pop(dados['chave'], default=None)
        resposta = jsonify({"resultado": "ok", "detalhes": "ok"})        
    except Exception as e:  # em caso de erro...
        resposta = jsonify({"resultado": "erro", "detalhes": str(e)})
            
    resposta.headers.add("Access-Control-Allow-Origin", "*")
    return resposta  

app.run(debug=True)

V
Valerij Dobler

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

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

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

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

session=abc123