背景
您可以使用base64 CLI 工具生成您的用户名 + 密码的 base64 编码版本,如下所示:
$ echo -n "joeuser:secretpass" | base64
am9ldXNlcjpzZWNyZXRwYXNz
-or-
$ base64 <<<"joeuser:secretpass"
am9ldXNlcjpzZWNyZXRwYXNzCg==
Base64 是可逆的,因此您也可以像这样对其进行解码以确认:
$ echo -n "joeuser:secretpass" | base64 | base64 -D
joeuser:secretpass
-or-
$ base64 <<<"joeuser:secretpass" | base64 -D
joeuser:secretpass
注意: 用户名 = joeuser,密码 = 密码
示例 #1 - 使用 -H
你可以像这样把它放在curl中:
$ curl -H "Authorization: Basic $(base64 <<<"joeuser:secretpass")" http://example.com
示例 #2 - 使用 -u
大多数人可能会同意,如果您打算这样做,那么您不妨使用curl 的-u 选项。
$ curl --help |grep -- "--user "
-u, --user USER[:PASSWORD] Server user and password
例如:
$ curl -u someuser:secretpass http://example.com
但是,如果您将凭据保存在加密的保管库服务中,例如 LastPass 或 Pass,则可以以一种更安全的方式执行此操作。
例如,我在这里使用 LastPass 的 CLI 工具 lpass 来检索我的凭据:
$ curl -u $(lpass show --username example.com):$(lpass show --password example.com) \
http://example.com
示例 #3 - 使用 curl 配置
不过,还有一种更安全的方法可以将您的凭据交给curl。此方法使用-K 开关。
$ curl -X GET -K \
<(cat <<<"user = \"$(lpass show --username example.com):$(lpass show --password example.com)\"") \
http://example.com
使用时,您的详细信息将保持隐藏状态,因为它们通过临时文件描述符传递给 curl,例如:
+ curl -skK /dev/fd/63 -XGET -H 'Content-Type: application/json' https://es-data-01a.example.com:9200/_cat/health
++ cat
+++ lpass show --username example.com
+++ lpass show --password example.com
1561075296 00:01:36 rdu-es-01 green 9 6 2171 1085 0 0 0 0 - 100.0%
注意:上面我正在与我们的一个 Elasticsearch 节点通信,询问集群的健康状况。
此方法动态创建一个内容为user = "<username>:<password>" 的文件并将其提供给curl。
HTTP 基本授权
上面显示的方法正在促进一种称为基本授权的功能,它是 HTTP 标准的一部分。
当用户代理想要将身份验证凭据发送到
服务器,它可以使用授权字段。
授权字段的构造如下:
- 用户名和密码由一个冒号 (:) 组合而成。
这意味着用户名本身不能包含冒号。
- 生成的字符串被编码为八位字节序列。字符集
默认情况下未指定用于此编码的,如
只要它与 US-ASCII 兼容,但服务器可能会建议使用
UTF-8 通过发送 charset 参数。
- 使用 Base64 的变体对生成的字符串进行编码。
- 然后将授权方法和空格(例如“Basic”)添加到
编码的字符串。
例如,如果浏览器使用 Aladdin 作为用户名,并且
OpenSesame 作为密码,则该字段的值为
Aladdin:OpenSesame 的 base64 编码,或 QWxhZGRpbjpPcGVuU2VzYW1l。
然后 Authorization 标头将显示为:
授权:基本 QWxhZGRpbjpPcGVuU2VzYW1l
来源:Basic access authentication