311

我正在学习 Apigility(Apigility 文档 -> REST 服务教程)并尝试通过 cURL 发送带有基本身份验证的 POST 请求:

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

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

这里的错误在哪里?如何让它工作?

4

3 回答 3

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

从文档页面:

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

指定用于服务器身份验证的用户名和密码。覆盖 -n、--netrc 和--netrc-optional。

如果您只是指定用户名,curl 将提示输入密码。

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

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

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

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

如果您使用启用了 Windows SSPI 的 curl 二进制文件并执行 Kerberos V5、Negotiate、NTLM 或 Digest 身份验证,那么您可以通过使用此选项指定单个冒号来告诉 curl 从您的环境中选择用户名和密码:“-u :” .

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

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

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

于 2014-12-12T11:03:06.550 回答
58

作为标题

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/
于 2018-12-05T11:05:15.927 回答
3

找出授权标头应该是什么样子的最简单方法可能是首先使用-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:apipwd@apigilityhw.sandbox.loc/status
    
# copy and paste the "Authorization" header from the output:
    
$ curl -H 'Authorization: Basic YWRtaW46YXBpcHdk' ... http://apigilityhw.sandbox.loc/status
于 2021-11-11T00:20:01.473 回答