如何正确使用cURL定义基本的HTTP认证?

问题描述 投票:0回答:4

我正在学习 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"

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

http curl authorization basic-authentication laminas-api-tools
4个回答
681
投票
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
标志,因为它是默认值。


73
投票

作为标题

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/

20
投票

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

0
投票

@srghma 等其他人已经演示了如何为标头设置此功能。我只是想指出

echo
base64
的论点很重要!如果你这样做:

echo "myusername:mypassword" | base64

由于回车符嵌入到字符串中,因此无法工作,因此

ne
--wrap 0

还值得注意的是,您不需要显式设置

Content-Type
。最基本的
GET
唯一需要的就是设置:

curl ... -H "Authorization: Basic <my-base64-encoded-username-and-password>"
© www.soinside.com 2019 - 2024. All rights reserved.