如何使用cURL设置授权头部

591

如何使用 cURL 传递授权头信息? (在 /usr/bin/curl 可执行文件中)。

14个回答

511

http://curl.se/docs/httpscripting.html

请查看第6部分:HTTP认证。

HTTP认证

HTTP认证是告诉服务器您的用户名和密码,以便它可以验证您是否被允许执行您正在进行的请求。HTTP中使用的基本认证(curl默认使用的类型)是基于明文的,这意味着它发送的用户名和密码只是经过轻微混淆,但是在您和远程服务器之间网络上嗅探流量的任何人都可以完全读取。

告诉curl使用用户名和密码进行身份验证:

curl --user name:password http://www.example.com
可能需要使用不同的身份验证方式(检查服务器返回的标头),然后--ntlm、--digest、--negotiate甚至--anyauth可能是适合您的选项。
有时,您只能通过使用HTTP代理来访问HTTP。这在各种公司似乎特别普遍。HTTP代理可能需要其自己的用户名和密码,以允许客户端通过到达互联网。要在curl中指定这些信息,请运行类似以下内容的命令:
curl --proxy-user proxyuser:proxypassword curl.haxx.se
如果代理服务器需要使用NTLM方法进行身份验证,请使用--proxy-ntlm,如果需要使用Digest,则使用--proxy-digest。 如果您使用这些用户+密码选项中的任何一个但省略了密码部分,则curl将交互式提示输入密码。 请注意,当运行程序时,可能可以通过列出系统中运行的进程来查看其参数。因此,如果将它们作为明文命令行选项传递,其他用户可能会观察到您的密码。有一些方法可以规避这个问题。 值得注意的是,虽然这是HTTP身份验证的工作原理,但很多网站在提供登录等服务时并不使用此概念。有关此事的更多详细信息,请参阅下面的Web登录章节。

19
这个问题明确与PHP无关。 [谷歌搜索结果出了什么问题]? - Oli
2
这个问题是关于授权而不是认证的,所以也许楼主应该更改问题的标题。 - jam

478

仅做补充,以便您无需单击:

curl --user name:password http://www.example.com

如果你要尝试为 OAuth 2 发送身份验证:

curl -H "Authorization: OAuth <ACCESS_TOKEN>" http://www.example.com

23
现在很多API都使用头部授权令牌。-H选项非常好用。 - eliocs
29
如果您使用-u或--user选项,Curl会将凭据编码为Base64,并生成如下的头信息:-H Authorization: Basic <Base64EncodedCredentials> - Timothy Kanski
我正在尝试使用HMAC-SHA256添加授权头,但总是出现缺少授权头的错误。 - Steven Aguilar
7
另外,如果您需要像@timothy-kansaki所提到的<Base64EncodedCredentials>,则可以使用以下命令获取已编码的凭据:cred="$( echo $NAME:$PASSWORD | base64 )"; curl -H "Authorization: Basic $cred" https://example.com。有关参考,请查看https://dev59.com/l2Qn5IYBdhLWcg3wVF0w。 - David Golembiowski
5
默认情况下,在Mac上使用echo命令会自动换行。如您链接中所述,您需要使用echo -n以防止包含换行符。 - brariden
1
或者更好的方法是使用 creds="$(printf $NAME:$PASSWORD | base64)" - MrE

259

Bearer令牌是这样的:

curl -H "Authorization: Bearer <ACCESS_TOKEN>" http://www.example.com

8
如果您想进行“基本”的授权,只需将“Bearer”替换为“Basic”。 - Darren Shewry
我遇到了奇怪的问题,我收到了“Authorization header格式错误”和“HTTP-200”的提示。这意味着服务器接受了我的授权,但格式有误? - Groostav

115

这个对我有用:

curl -H "Authorization: Bearer xxxxxxxxxxxxxx" https://www.example.com/

你在使用什么来处理JWT? - Ciasto piekarz
1
你是不是指的是 Authorization: bearer xxxxxxxxx - jlh
2
@jlh 你是指 Bearer 吗? - Daniel W.
8
我几乎确定它是不区分大小写的,但现在看来我错了。是的,我的意思是 Bearer - jlh

76

(对于那些正在寻找php-curl的答案)

$service_url = 'https://example.com/something/something.json';
$curl = curl_init($service_url);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, "username:password"); //Your credentials goes here
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post_data);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //IMP if the url has https and you don't want to verify source certificate

$curl_response = curl_exec($curl);
$response = json_decode($curl_response);
curl_close($curl);

var_dump($response);

30

对于HTTP基本身份验证:

curl -H "Authorization: Basic <_your_token_>" http://www.example.com

替换_your_token_和URL。


当使用oauth时,授权令牌会从哪里获取?我正在尝试使用curl从一个需要用户名和密码的网站下载文件,但似乎由于使用了oauth2而失败了。 - ctrl-alt-delete
@toasteez 你需要通过Oauth2流程来获取令牌。通常这是一个两步骤的过程,应该在服务器文档中详细说明。 - Devaroop
19
好的回答。一个小助手 echo -ne "<your-user>:<your-pass>" | base64 --wrap 0 可以生成基本认证令牌。 - Mike D
3
@MikeD -H "Authorization: Basic <_your_token_>"--user login:password 有同样的效果。你可以用 curl -v 命令来验证。 - vladkras
2
@vladkras 我的回复是对这个答案的辅助。根据我的经验,最好理解如何创建令牌,而不是依赖curl生成它。 - Mike D

19

在使用以下命令时请注意:

curl -H "Authorization: token_str" http://www.example.com

token_strAuthorization之间必须使用空格分隔,否则服务器端将无法获取HTTP_AUTHORIZATION环境变量。


6
如果需要空格,那么你的HTTP服务器有问题。此外,你需要两个字符串,一个类型和一个令牌。 - Alexis Wilke

11

这个例子包括以下内容:

curl -X POST -H "Content-Type: application/json" -d '{"name”:”Johnny B. Goode”, "email”:”johnny.b.goode@mail.com"}' -H "Authorization: Bearer $(echo -n  Guitar Maestro | base64)" https://url-address.com 


10

如果您在调用时没有令牌,那么您将需要进行两次调用,一次是获取令牌,另一次是从响应中提取令牌,请注意

grep token | cut -d, -f1 | cut -d\" -f4

因为这是处理从响应中提取令牌的部分。

echo "Getting token response and extracting token"    
def token = sh (returnStdout: true, script: """
    curl -S -i -k -X POST https://www.example.com/getToken -H \"Content-Type: application/json\" -H \"Accept: application/json\" -d @requestFile.json | grep token | cut -d, -f1 | cut -d\\" -f4
""").split()
提取令牌后,您可以按以下方式使用令牌进行后续调用。
echo "Token : ${token[-1]}"       
echo "Making calls using token..."       
curl -S -i -k  -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer ${token[-1]}" https://www.example.com/api/resources 

10
从curl 7.61.0开始,您可以使用“--oauth2-bearer ”选项来设置正确的Bearer授权标头。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接