417 Stimmen

Wie verwendet man cURL, um Cookies zu senden?

Ich habe gelesen, dass das Senden von Cookies mit cURL funktioniert, aber nicht für mich.

Ich habe einen REST-Endpunkt wie diesen:

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

Wenn ich versuche, auf den Endpunkt zuzugreifen, wird er abgelehnt:

curl -v -b ~/Downloads/cookies.txt -c ~/Downloads/cookies.txt http://127.0.0.1:5000/
* Verbindungsaufbau zu 127.0.0.1 Port 5000 (#0)
*   127.0.0.1 wird verbunden...
* verbunden
* Verbindung zu 127.0.0.1 (127.0.0.1) Port 5000 (#0) hergestellt
> GET / HTTP/1.1
> User-Agent: curl/7.27.0
> Host: 127.0.0.1:5000
> Akzeptieren: */*
>
* HTTP 1.0, Annahme nur body-Daten schließen
< HTTP/1.0 401 UNAUTHORIZED
< Content-Type: application/json
< Content-Length: 16
< Server: Werkzeug/0.8.3 Python/2.7.2
< Datum: Sonntag, 14. April 2013 04:45:45 GMT
<
* Verbindung #0 zum Host 127.0.0.1 geschlossen
"nicht autorisiert"%

Der Inhalt meiner ~/Downloads/cookies.txt ist:

cat ~/Downloads/cookies.txt
USER_TOKEN=in

und der Server empfängt nichts:

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 -

127.0.0.1 - - [13/Apr/2013 21:45:45] "GET / HTTP/1.1" 401 -

Was fehlt mir?

4voto

Chris Laidler Punkte 61

Ich benutze Debian und konnte das Tilde-Zeichen für den Pfad nicht verwenden. Ursprünglich benutzte ich

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

Ich musste dies ändern zu:

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

-c erstellt das Cookie, -b verwendet das Cookie

also würde ich dann zum Beispiel verwenden:

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

2voto

hvescovi Punkte 31

Another solution using json.

CURL:

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

PYTHON CODE:

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:  # im Fehlerfall...
        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:  # im Fehlerfall...
        resposta = jsonify({"resultado": "erro", "detalhes": str(e)})

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

app.run(debug=True)

1voto

ldmtwo Punkte 370

Hier ist ein Beispiel für den richtigen Weg, um Cookies zu senden. -H 'cookie: key1=val2; key2=val2;'

cURL bietet auch den Komfort von --cookie. Führen Sie man curl oder tldr curl aus

Dies wurde von Chrome > Inspect > Netzwerk > Als cURL kopieren.

curl 'https://www.example.com/api/app/job-status/' \
  -H 'authority: www.example.com' \
  -H 'sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, wie Gecko) Chrome/92.0.111.111 Safari/111.36' \
  -H 'content-type: application/json' \
  -H 'accept: */*' \
  -H 'origin: https://www.example.com' \
  -H 'sec-fetch-site: same-origin' \
  -H 'sec-fetch-mode: cors' \
  -H 'sec-fetch-dest: empty' \
  -H 'referer: https://www.example.com/app/jobs/11111111/' \
  -H 'accept-language: en-US,en;q=0.9' \
  -H 'cookie: menuOpen_v3=true; imageSize=medium;' \
  --data-raw '{"jobIds":["1111111111111"]}' \
  --compressed

0voto

Valerij Dobler Punkte 516

Ich benutze GitBash unter Windows und nichts, was ich gefunden habe, hat für mich funktioniert.

Also habe ich mich dazu entschlossen, meinen Cookie in einer Datei mit dem Namen .session zu speichern und habe dann mit cat daraus gelesen, wie folgt:

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

Und wenn du neugierig bist, mein Cookie sieht so aus:

session=abc123

0voto

GeorgeH Punkte 1

Dies hat bei mir funktioniert:

curl -v -H 'cookie: _appname_session=lksjdflsdkj...; path=/; HttpOnly; SameSite=Lax' localhost:3000/

Beachten Sie, dass der Sitzungsname _appname_session ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X