我正在尝试向需要带有 Base64 编码的用户名和密码 bruce:1234 的身份验证标头的路由发出 GET 请求。当我尝试时:
curl -v http://localhost:3000/api/users \
-H "Authorization:Basic `echo -n bruce:1234 | base64`" \
-H "Accept:application/json"
Run Code Online (Sandbox Code Playgroud)
...我从 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
Run Code Online (Sandbox Code Playgroud)
但是,当我直接替换为 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.].
Run Code Online (Sandbox Code Playgroud)
对我来说奇怪的是,CURL 命令的初始输出(由于详细标志 -v)对于这两种方法完全相同,那么为什么第一种方法会失败呢?
好吧,我终于弄清楚了这里发生的事情的真相。我使用的是 Mac,Mac 的本机 base64 不会在其输出中添加任何空格。因此,理论上,原始语法是可行的。但是,我还使用 homebrew 安装了 base64,该版本优先,并且它确实添加了新行。
另一个问题如下。基于这个响应,我假设添加的字符是换行符“\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'
Run Code Online (Sandbox Code Playgroud)
总之,您需要了解不同 Base64 构建的不同行为:
tr -d \\r。tr -d \\n。