如何使用cURL正确定义基本的HTTP身份验证?


160

我正在学习Apigility(Apigility docu-> REST Service Tutorial),并尝试通过cURL发送具有基本身份验证的POST请求:

$ curl -X POST -i -H "Content-Type: application/hal+json" -H "Authorization: Basic YXBpdXNlcjphcGlwd2Q=" http://apigilityhw.sandbox.loc/status

YXBpdXNlcjphcGlwd2Q=是带有我的凭据的基数为64的编码字符串apiuser:apipwd。凭据保存在/data/htpasswdapiuser:$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"

这里的错误在哪里?如何运作?

Answers:


291
curl -u username:password http://
curl -u username http://

从文档页面:

-u,--user <用户名:密码>

指定用于服务器认证的用户名和密码。覆盖-n,-netrc和--netrc-optional。

如果仅指定用户名,curl会提示您输入密码。

用户名和密码在第一个冒号上分开,这使得使用此选项无法在用户名中使用冒号。密码仍然可以。

在基于Windows的服务器上使用Kerberos V5时,应在用户名中包括Windows域名,以便服务器成功获取Kerberos票证。如果您不这样做,则初始身份验证握手可能会失败。

使用NTLM时,例如,如果您的设置中只有一个域和林,则可以将用户名简单地指定为用户名,而不指定域。

要指定域名,请使用“下级登录名”或UPN(“用户主体名称”)格式。例如,分别为EXAMPLE \ user和user@example.com。

如果使用支持Windows SSPI的curl二进制文件并执行Kerberos V5,协商,NTLM或摘要式身份验证,则可以通过使用以下选项指定单个冒号来告诉curl从您的环境中选择用户名和密码:“ -u:” 。

如果多次使用此选项,则将使用最后一个。

http://curl.haxx.se/docs/manpage.html#-u

请注意,您不需要--basic标记,因为它是默认标记。


14
如果您的密码包含某些特殊字符,例如?或@,则必须将其打勾。curl -u'用户名:?p @ ssword'http://
Mirko Ebert

2
但是实际要求是什么样的?我觉得很多人都会用curl进行测试,然后用他们使用的任何语言编写代码。--user信息是否作为标题发送?如果是这样的话,标题应该是什么样子
Verty00 '17

Postman中的@GautamKathrotiya在请求的“授权”选项卡中有一个“基本身份验证”选项,它将为您插入此“授权”标头。
凯尔·卡莉卡·圣

1
@ Verty00可以将-v标志与curl一起使用以查看请求的内容。
扎克

17

作为标题

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/
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.