Как повторить base64 в CURL? - PullRequest
       1

Как повторить base64 в CURL?

0 голосов
/ 06 января 2019

Я пытаюсь выполнить запрос GET к маршруту, для которого требуется заголовок аутентификации с именем пользователя и паролем в кодировке base64 bruce: 1234. Когда я пытаюсь:

curl -v http://localhost:3000/api/users \
     -H "Authorization:Basic `echo -n bruce:1234 | base64`" \
     -H "Accept:application/json"

... Я получаю следующий вывод из команды CURL:

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 3000 (#0)
> GET /api/users HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.61.0
> Authorization:Basic YnJ1Y2U6MTIzNA==
> Accept:application/json
>
< HTTP/1.1 400 Bad Request
* no chunk, no close, no size. Assume close to signal end
<
* Closing connection 0

Однако, когда я подставляю значение в кодировке base64 напрямую, оно работает:

curl -v http://localhost:3000/api/users \
     -H "Authorization:Basic YnJ1Y2U6MTIzNA==" \
     -H "Accept:application/json"

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 3000 (#0)
> GET /api/users HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.61.0
> Authorization:Basic YnJ1Y2U6MTIzNA==
> Accept:application/json
>
< HTTP/1.1 200 OK
... [data returned, etc.].

Что странно для меня, так это то, что начальный вывод команды CURL (из-за многословного флага -v) одинаков для этих двух подходов, так почему же тогда первый подход терпит неудачу?

1 Ответ

0 голосов
/ 07 января 2019

Хорошо, я в конце концов понял, что здесь происходит. Я использую Mac, и нативная base64 для Mac не добавляет пробелов к выводу. Таким образом, теоретически, оригинальный синтаксис будет работать. Тем не менее, я также установил base64 с помощью homebrew, эта версия имела преимущество, и он добавляет новую строку.

Еще одна ошибка заключается в следующем. Основываясь на этом ответе , я предположил, что добавляемый символ был символом новой строки '\ n', поэтому я потратил целую вечность, играя с ... | base64 | tr -d \\n трубами без какого-либо успеха. В конце концов я понял, что в версии brew не было добавлено «\ n», но «\ r», и, наконец, я получил это к работе:

curl -v http://localhost:3000/api/users \
     -H "Authorization:Basic $(echo -n bruce:1234 | base64 | tr -d \\r)" \
     -H 'Accept:application/json'   

Таким образом, вы должны знать о различном поведении разных сборок base64:

  • Родной Mac: base64 по умолчанию ничего не добавляет - больше не требуется никаких трубопроводов.
  • Homebrew: base64 добавляет '\ r' - вам нужно пропустить его через tr -d \\r.
  • Linux: base64 (часто) добавляет '\ n' - вам нужно передать его через tr -d \\n.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...