curl中的'--user'是什么意思?

101

我正在使用一个API,需要发送POST请求。我知道如何设置头部(-H),(-d)是主体,但"--user"是什么意思?

如果我在Postman中提交此内容,或者在axios或常规XMLRequest中的文本编辑器中提交,我应该在哪里添加它?

文档上说这是用于普通的HTTP身份验证。

curl -X POST -H "Content-Type: application/json" \
     --user "<client_id>:<client_secret>" \
     -d '{"grant_type": "client_credentials", "scope": "public"}' \
     ...

1
https://dev59.com/MF8e5IYBdhLWcg3wNYQn#27442239 - ROMANIA_engineer
4
不使用curl,我该怎么做呢?这个该放在header对象里面吗?我试过将client_id和client_secret设置为头部的键值对,也试过将键设置为'Authorization',将值设置为<client_id>:<client_secret>(当然要用实际的id和secret)。但都没有成功。那么在文本编辑器中该怎么使用呢? - anon
1
如何在不使用CURL的情况下完成这个操作,确实没有一个答案回答了这个问题。 - Andrew Koster
5
四年过去了,这个问题仍然有用,但没有人正确回答。1)你不应该接受低水平的答案。2)你的评论是问题中非常有用的一部分,应该被编辑到正文中。 - Greg Woods
3
Jahmic的回答更好。 - MattPark
6个回答

128

虽然有点晚了,但我还是要说一下...

您可以在使用curl命令时添加-v参数来查看发送的头部信息。之后您将会发现,使用--user参数提供的信息会被转化为一个头部,例如:

Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l

Basic 关键字后面的文本是使用 --user 参数提供的用户名:密码组合的base64编码文本字符串。

在Linux上手动生成base64编码的凭据,您只需运行以下命令:

echo -n "username:password" | base64 -w0

对于Windows系统,将“用户名:密码”保存到文件中,然后使用certutil.exe创建一个Base64编码的文件:

certutil -encode credentials.txt credentials.asc

为了进行端到端测试,您可以删除--user username:password并使用--header Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l代替,它仍将成功验证。

总之,如果没有使用curl来执行此操作,您需要对username:password组合进行base64编码,然后设置HTTP头Authorization的类型为Basic,以及base64编码的字符串。


对于像我这样的其他新手,请从echo -n“username:password”中删除双引号,除非您确实想在用户名或密码中包含它们。 - S.V.
这个回答恰好回答了问题。在Spring OAuth2安全性中,我可以使用curl -u ...获取“client_crendentials”授权类型的令牌,并且它适用于寻找Authentication: Basic...的代码,下面是片段,@Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { final boolean debug = this.logger.isDebugEnabled(); String header = request.getHeader("Authorization"); - Jose Quijada
我很困惑为什么这个信息没有列在 man --pager='less -p "^ +-u, --user <user:password>"' curl 下面?好答案! - Jonathan Komar

27

--user (或 -u) 在 curl 中为您的请求提供基本身份验证。

在 Postman 中,您可以通过 Authorization 选项卡中的选择来实现同样的结果。

--user "<client_id>:<client_secret>" 变成了

  • 类型:基本身份验证
  • 用户名:client_id
  • 密码:client_secret

输入图像描述


26

--user参数用于中的服务器身份验证。因此,如果您没有通过其他参数(如--digest--negotiate)定义身份验证类型,则表示用于HTTP基本身份验证的USER参数,它还可以与:PASSWORD组合使用以设置密码。对于您发送请求的API后面所使用的身份验证类型,完整的答案取决于具体情况,可能curl不足以支持所有身份验证方式,因为它仅支持有限的一些身份验证方案…


2

指定用于服务器身份验证的用户名和密码。如果您只指定用户名,curl将提示输入密码。

如果您的curl请求没有任何--user选项,则需要身份验证的服务器会发送一个401响应代码和一个关联的WWW-Authenticate:头,其中列出了服务器支持的所有身份验证方法。

< HTTP/1.1 401 
< WWW-Authenticate: Basic realm="oauth2/client"

那么你就会知道服务器正在使用基本身份验证。

你可以添加--basic来明确告诉它是基本身份验证。

请参考HTTP身份验证获取更多信息。


1
有时(取决于服务器的实现方式),--user会协商摘要认证会话。摘要用户的标头是一次性使用的。我相信向服务器发出的请求将首先失败,并包含一个WWW-Authenticate响应,包括摘要领域和nonce密钥。有了这些,可以使用新的Authorization值进行第二个请求。
示例:
Authorization: Digest username="LXAIQKBC", realm="MMS Public API", nonce="rE3sYnLXEhVMbh72JyUK7kfLIb+bAbKj", uri="/api/atlas/v1.0/groups", cnonce="YTVhM4YwMDB3ZjZjMTkxbCNiODA1ODnxZDFjOGMyMzE=", nc=00000001, qop=auth, response="7a5fcb8e4f92a665315bf62cdd87a67d", algorithm="MD5"

0

作为 Jahmic 回答的补充,Nodejs 程序员可以使用以下代码将其转换为 base64 字符串:

const cryptoJS = require("crypto-js");    
const base64Str = cryptoJS.enc.Base64.stringify(cryptoJS.enc.Utf8.parse(`${username}:${password}`))

2
虽然这可能对未来的访问者有用,但它与Postman无关。 - User1010

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