【问题标题】:What does '--user' mean with curlcurl 中的“--user”是什么意思
【发布时间】:2016-07-17 11:41:18
【问题描述】:

我正在使用 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"}' \
     ...

【问题讨论】:

  • 那么我如何不使用 curl 来做到这一点。它是否进入标题对象内部?我尝试将 client_id 和 client_secret 设置为标题中的键和值。我尝试将密钥设置为“授权”,将值设置为 : (当然是实际的 id 和 secret)。没有运气。那么如何在文本编辑器中使用它呢?
  • 确实如何在不使用 CURL 的情况下做到这一点。这些答案都没有回答。
  • 4 年了...仍然是一个有用的问题,但没有人正确回答,1)您不应该接受不合标准的答案 2)您的评论是问题中非常有用的部分,应该是一个编辑。
  • Jahmic 下面的回答更好

标签: authentication post curl


【解决方案1】:

curl 中的--user 参数用于服务器身份验证。所以如果你没有通过其他参数如--digest或--negotiate来定义认证类型,这意味着用于http基本认证的USER参数,它也可以与:PASSWORD块组合来设置密码。您问题的完整答案取决于您向其发送请求的 API 背后使用哪种身份验证,并且 curl 可能还不够,因为它支持一组有限的身份验证方案...

【讨论】:

    【解决方案2】:

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

    如果您的 curl 请求没有任何 -- 用户,那么 需要身份验证的服务器发回 401 响应代码和关联的 WWW-Authenticate: 标头,其中列出了服务器支持的所有身份验证方法。

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

    然后你就会知道服务器正在使用基本身份验证

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

    更多信息请参考HTTP authentication

    【讨论】:

      【解决方案3】:

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

      在 Postman 中,您可以通过在“授权”选项卡中进行选择来获得相同的结果。

      --user "&lt;client_id&gt;:&lt;client_secret&gt;" 变为

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

      【讨论】:

        【解决方案4】:

        聚会迟到了,但这里……

        您可以使用 curl 和 -v(详细)参数来查看发送的标头。然后你会看到 --user 提供的信息被转换成一个标题,例如:

        Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
        

        Basic 关键字后面的文本是 --user 参数提供的 username:password 组合的 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 编码。然后,您需要设置类型为 Basic 的 HTTP Authorization 标头以及 base64 编码字符串。

        【讨论】:

        • 这才是真正的答案。
        • 感谢您的回复。这正是我想要的
        • 对于像我这样的其他笨蛋,请删除 echo -n "username:password" 中的双引号,除非您真的想将它们包含在您的用户名或密码中
        • 这完全回答了问题。在 Spring OAuth2 安全性中,我可以使用curl -u ... 获取 gran 类型“client_crendentials”的令牌以获取访问令牌,并且它与正在寻找 Authentication: Basic... 的代码一起使用,sn-p 下面来自 @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { final boolean debug = this.logger.isDebugEnabled(); String header = request.getHeader("Authorization"); 跨度>
        • 我很困惑为什么这些信息没有在man --pager='less -p "^ +-u, --user &lt;user:password&gt;"' curl 下列出?好答案!
        【解决方案5】:

        作为对 Jahmic 答案的补充,Nodejs 程序员可以这样做以转换为 base64 字符串:

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

        【讨论】:

        • 虽然这可能对未来的访问者有用,但它与邮递员无关。
        【解决方案6】:

        有时(取决于服务器实现)--user 会协商一个摘要认证会话。摘要用户的标题是一次性使用的。我相信对服务器的请求首先会以 401 失败,但会包含 WWW-Authenticate 响应,包括摘要领域和 nonce 机密。使用这些,可以使用新的标头授权值发出第二个请求。

        示例:

        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"
        

        【讨论】:

          猜你喜欢
          • 2021-02-09
          • 2019-03-13
          • 1970-01-01
          • 2014-06-18
          • 1970-01-01
          • 2023-03-07
          • 1970-01-01
          • 1970-01-01
          • 2012-08-30
          相关资源
          最近更新 更多