我正在学习 Apigility(Apigility docu -> REST 服务教程)并尝试通过 cURL 发送带有基本身份验证的 POST 请求:
$ curl -X POST -i -H "Content-Type: application/hal+json" -H "Authorization: Basic YXBpdXNlcjphcGlwd2Q=" http://apigilityhw.sandbox.loc/status
YXBpdXNlcjphcGlwd2Q=
是带有我的凭据 apiuser:apipwd
的 Base 64 编码字符串。凭据保存在 /data/htpasswd
(apiuser:$apr1$3J4cyqEw$WKga3rQMkxvnevMuBaekg/
) 中。
看起来像这样:
HTTP/1.1 401 Unauthorized
Server: nginx/1.4.7
Date: Mon, 22 Sep 2014 07:48:47 GMT
Content-Type: application/problem+json
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.5.12-1~dotdeb.1
WWW-Authenticate: Basic realm="api"
这里错在哪里?如何让它发挥作用?
curl -u username:password http://
curl -u username http://
来自文档页面:
-u,--用户
指定用于服务器身份验证的用户名和密码。 覆盖 -n、--netrc 和 --netrc-可选。
如果您仅指定用户名,curl 将提示输入密码。
用户名和密码在第一个冒号上分开,这 使用此选项无法在用户名中使用冒号。 密码还是可以的。
在基于 Windows 的服务器上使用 Kerberos V5 时,您应该包括 用户名中包含 Windows 域名,以便服务器 成功获取 Kerberos 票证。如果你不这样做,那么最初的 身份验证握手可能会失败。
使用 NTLM 时,可以将用户名简单指定为 user 名称,不带域,如果有单个域和林 例如您的设置。
要指定域名,请使用下级登录名或 UPN (用户主体名称)格式。例如,EXAMPLE\user 和 [电子邮件受保护] 分别。
如果您使用支持 Windows SSPI 的curl 二进制文件并执行 Kerberos V5, 协商、NTLM 或摘要式身份验证,然后您可以告诉curl 通过指定从您的环境中选择用户名和密码 带有此选项的单个冒号:“-u :”。
如果多次使用此选项,则将使用最后一次。
http://curl.haxx.se/docs/manpage.html#-u
--basic
标志,因为它是默认值。
作为标题
AUTH=$(echo -ne "$BASIC_AUTH_USER:$BASIC_AUTH_PASSWORD" | base64 --wrap 0)
curl \
--header "Content-Type: application/json" \
--header "Authorization: Basic $AUTH" \
--request POST \
--data '{"key1":"value1", "key2":"value2"}' \
https://example.com/
弄清楚授权标头应该是什么样子的最简单方法可能是首先使用 -u(或将凭据放在 URL 中)和 -v 运行 curl,输出将显示请求标头:
$ curl -v -u 'apiuser:apipwd' ... http://apigilityhw.sandbox.loc/status
# OR putting the credentials in the URL:
$ curl -v ... http://apiuser:[email protected]/status
# copy and paste the "Authorization" header from the output:
$ curl -H 'Authorization: Basic YWRtaW46YXBpcHdk' ... http://apigilityhw.sandbox.loc/status
@srghma 等其他人已经演示了如何为标头设置此功能。我只是想指出
echo
和 base64
的论点很重要!如果你这样做:
echo "myusername:mypassword" | base64
由于回车符嵌入到字符串中,因此无法工作,因此
ne
和 --wrap 0
。
还值得注意的是,您不需要显式设置
Content-Type
。最基本的GET
唯一需要的就是设置:
curl ... -H "Authorization: Basic <my-base64-encoded-username-and-password>"