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

aut*_*tix 106 curl authorization http 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
Run Code Online (Sandbox Code Playgroud)

YXBpdXNlcjphcGlwd2Q=是我的凭据的基本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"
Run Code Online (Sandbox Code Playgroud)

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

Gaj*_*jus 201

curl -u username:password http://
curl -u username http://
Run Code Online (Sandbox Code Playgroud)

从文档页面:

-u, - user <user:password>

指定用于服务器身份验证的用户名和密码.覆盖-n, - inttrc和--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标记,因为它是默认值.

  • 如果您的密码包含一些特殊字符,如?或@然后你必须将它放入单个刻度.curl -u'用户名:?p @ssword'http:// (9认同)
  • @Verty00您可以使用-v标志和curl来查看请求的内容。 (3认同)
  • 但这个实际要求是什么样的呢?我觉得很多人用curl测试,然后用他们使用的任何语言编写代码等. - 用户信息是否作为标题发送?如果是这样,那个标题应该是什么样的 (2认同)

nad*_*000 18

弄清楚授权标头应该是什么样子的最简单方法可能是首先使用 -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
Run Code Online (Sandbox Code Playgroud)


srg*_*hma 10

作为标题

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/
Run Code Online (Sandbox Code Playgroud)

  • 您能为 Windows 10 添加标头选项吗? (2认同)
  • 我已经过去了一点,但我遇到了一个问题,当我发送 Base64 编码的用户名:密码字符串来验证子字符串错误时,会引发错误。我询问有关 Windows 10 的问题,因为在 Windows 10 下使用 *NIX curl 语句时需要一些“转换”,部分原因是至少有 3 个不同的实用程序在 Windows 中提供类似curl 的功能,包括嵌入在 Git 中的curl、在 Windows 中嵌入的curl Windows 10 和使用 commandlet 在 WIndows 10 中进行命令行 URL 调用的“专家推荐”方法 (2认同)

Wil*_*ilt 7

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

GET https://www.example.com/v1/users/1?access_token=abcdefghijklmnopqrstuvwxyz1234567890ABCD
Run Code Online (Sandbox Code Playgroud)