Как использовать cURL для отправки файлов cookie?

296

Я читал, что Отправка куки с завитком работает, но не для меня.

У меня есть 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, который может оказаться не тем, что вы хотите.
Блендер
тот, у которого есть -bтолько опция, тоже не работает, выдает ту же ошибку :(
daydreamer
Формат -bфайла cookie не просто var=value, он должен совпадать с форматом файла cookie, написанного с использованием -c. Перейдите на сайт, который отправляет куки с этой опцией, и посмотрите на полученный файл.
Бармар
Файл -b cookie_file должен быть либо в формате Netscape / Mozilla, либо в виде простых заголовков HTTP. Вот пример простых заголовков http: Set-cookie: cookie_name = cookie_value; Это самый минимум. Не забывайте точку с запятой в конце.
Алекс

Ответы:

492

Это сработало для меня:

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

Я мог видеть значение в бэкэнде, используя

print request.cookies
мечтатель
источник
17
Пока у вас никогда не будет логического значения для токена пользователя в виде файла cookie, учитывая, что они могут просто аутентифицировать себя, не входя таким образом.
matts1
15
Согласно man-странице, для опции -b, --cookie, например curl -b <file-or-pairs>, если аргумент является строкой с '='символом, он передается как есть, в противном случае он обрабатывается как имя файла для чтения файла cookie.
ryenus
61
с помощью точки с запятой можно установить несколько файлов cookie--cookie "key1=val1;key2=val2;..."
Интересно, почему этот ответ не интересует ... Плагин сортировки ответов?
19
91

Вы можете обратиться к 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/

читать куки-файлы и запускать их, или, если это не файл, он передаст данную строку.

Моин М
источник
1
ИМО вы не усиливал на официальном документ , который ясно , как грязи - рядом с перегрузкой на -bфлаге , что является существенным различий между -cи -bони оба запуска двигателя и указать на файл печенья?
nhed
4
@nhed -c пишет в файл cookie, -bчитает из него. Поэтому, отправляя учетные данные для формы входа в систему, вы указываете -cзаписать полученный файл cookie в файл, а затем использовать его -bдля чтения и включения файла cookie в свой следующий запрос.
Madbreaks
26
Или curl -b cookiefile -c cookiefile https://yourhost/читайте и пишите в тот же магазин cookie, что и браузеры.
LinuxDisciple
38

Вы используете неправильный формат в вашем файле cookie. Как говорится в документации curl , он использует старый формат файлов cookie Netscape, который отличается от формата, используемого веб-браузерами. Если вам нужно вручную создать файл cookie curl, этот пост должен вам помочь. В вашем примере файл должен содержать следующую строку

127.0.0.1   FALSE   /   FALSE   0   USER_TOKEN  in

7 разделенных табуляцией полей: домен , соответствие , путь , безопасность , срок действия , имя , значение .

yurloc
источник
2
Да, это формат файлов cookie cURL. Это вкладки, а не пространства.
m3nda
4
Это должно быть помечено как официальный ответ, так как это действительно указывает на причину сбоя установки @ daydreamer.
Valber
0

Если вы уже сделали этот запрос в своем приложении и видите, что он зарегистрирован в Google Dev Tools, вы можете использовать команду copy cURL из контекстного меню, щелкнув правой кнопкой мыши запрос на вкладке сети. Копировать -> Копировать как cURL. Он будет содержать все заголовки, куки и т. Д.

кувырок
источник