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

时间:2014-09-22 07:58:08

标签: http curl authorization basic-authentication apigility

我正在学习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=是带有我的凭据apiuser:apipwd的基本64位编码字符串。凭据保存在/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"

这里的错误在哪里?如何让它发挥作用?

3 个答案:

答案 0 :(得分:183)

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

从文档页面:

  

-u, - user< user:password>

     

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

     

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

     

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

     

将Kerberos V5与基于Windows的服务器一起使用时,应该包括   用户名中的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标记,因为它是默认标记。

答案 1 :(得分:7)

使用OAuth或其他身份验证服务时,您通常也可以在查询字符串中而不是在授权标头中发送访问令牌,例如:

GET https://www.example.com/v1/users/1?access_token=abcdefghijklmnopqrstuvwxyz1234567890ABCD

答案 2 :(得分:6)

作为标题

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/