linux - 如何在 CURL 中回显 base64?

标签 linux curl

我正在尝试向需要具有 Base64 编码的用户名和密码 bruce:1234 的身份验证 header 的路由发出 GET 请求。当我尝试时:

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)对于这两种方法完全相同,那么为什么第一种方法会失败?

最佳答案

好吧,我最终弄清了这里发生的事情的真相。我使用的是 Mac,Mac 的 native base64 不会在其输出中添加任何空格。因此,理论上,原始语法是可行的。但是,我还使用自制程序安装了base64,that version优先,并且它确实添加了一个新行。

另一个问题如下。基于this response ,我假设添加的字符是换行符 '\n',所以我花了很长时间摆弄 ... | 64 位 | 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 构建的不同行为:

  • native Mac:base64 默认情况下不添加任何内容 - 不需要进一步的管道。
  • Homebrew:base64 添加 '\r' - 您需要通过 tr -d\\r 通过管道传输它。
  • Linux:base64(通常)添加“\n”——您需要通过 tr -d\\n 对其进行管道传输。

关于linux - 如何在 CURL 中回显 base64?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54065193/

相关文章:

linux - 在 linux 命令行中使用 curl --data 上传 cURL http post 文件

c++ - 有哪些关于测试和测试驱动开发的好的在线介绍?

mysql - 如何获取 Mysql INSERT 以向 pthread 互斥体发出信号

python - 如何通过按下按钮关闭程序?

c - 如果 posix 关闭调用失败怎么办?

php - PayPal Express Checkout PHP 没有得到响应

php - 我如何在 OSX 10.11.6 上使用 OpenSSL 而不是 SecureTransport 和 Apache PHP

linux - 命令KILL可以发送所有信号吗?

c++ - cURL FTP 出现 405 错误

ruby-on-rails - 将 curl(使用 --data-urlencode)转换为 ruby