我正在尝试向一个路由发出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命令的初始输出(由于verbose flag-v)对于这两种方法是完全相同的,那么为什么第一种方法会失败呢?

最佳答案

好吧,我终于弄清了这里发生的一切。我使用的是mac,mac的原生base64不会在其输出中添加任何空格。所以,从理论上讲,原来的语法是可行的。但是,我也使用自制程序安装了base64,that version优先,它确实添加了一行。
另一个问题如下。基于this response,我假设要添加的字符是换行字符'\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默认情况下不添加任何内容——不需要进一步的管道。
自酿:Base64添加了'\r'——您需要通过tr -d \\r进行管道传输。
Linux:Base64(通常)会添加“\n”--您需要通过管道将其传递到tr -d \\n

09-10 03:08
查看更多