【问题标题】:GET request works in browser, but I get Unauthorized when using PostmanGET 请求在浏览器中有效,但在使用 Postman 时我得到了未经授权
【发布时间】:2017-09-20 12:19:09
【问题描述】:

我正在通过 chrome 发出请求:

[org]/api/data/v8.1/accounts?$select=name,accountid&$top=3

我得到了合理的回应:

{
  "@odata.context":"[org]/api/data/v8.1/$metadata#accounts(name,accountid)","value":[
    {
      "@odata.etag":"W/\"769209\"","name":"Telco","accountid":"c6ed63e0-9664-e411-940d-00155d104b35"
    },{
      "@odata.etag":"W/\"752021\"","name":"Fourth Coffee","accountid":"d1eefc0a-3ebc-e611-80be-24be051ac8a1"
    },{
      "@odata.etag":"W/\"768036\"","name":"Fourth Coffee","accountid":"3cbb8d24-20bd-e611-80c0-24be051ac8a1"
    }
  ]
}

但是,当尝试通过邮递员执行相同的 GET 操作时,我收到了 401 未授权!

我已经尝试过完全没有标题,以及基本身份验证:

Authorization:Basic Y2hybGFiXxxxxxxxxxxxxxcmQxMjM=

我做错了什么?我需要在 CRM 中进行更改以允许我从邮递员那里执行 GET 吗?

以下是 Chrome 使用的标头(从 DevTools 获得):

  • 接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
  • 接受编码:gzip、deflate、sdch
  • 接受语言:en-US,en;q=0.8
  • 授权:协商 TlRMTVNTUAADAAAAGAAYAIoAAABkAWQBogAAAAwADABYAAAADgAOAGQAAAAYABgAcgAAABAAEAAGAgAAFYKI4gYBsR0AAAAPai35LURprYMgYVSwMQXi / 2MAaAByAGwAYQBiAGEAZwBvAHIAZABvAG4ASABPAFUALQBXAFMALQBBAEcATwBSAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd0avVN8acJQKvlSN8hYrSgEBAAAAAAAAoBg7uZi80gEIIthtN5clBAAAAAACAAYARABFAFYAAQAUAEIAQQBOAEMAUgBNADIAMAAxADYABAAcAGQAZQB2AC4AYwBoAHIAbABhAGIALgBpAG4AdAADADIAQgBBAE4AQwBSAE0AMgAwADEANgAuAGQAZQB2AC4AYwBoAHIAbABhAGIALgBpdddddddddddddddbABhAGIALgBpAG4AdAAHAAgAoBg7uZi80gEGAAQAAgAAAAgAMAAwAAAAAAAAAAEAAAAAIAAAccTLbO5YZuNnhdCDsjPCg1YXJuNv0XuASIhHrWWBg7kKABAAAAAAAAAAAAAAAAAAAAAAAAkAPABIAFQAVABQAC8AYgBhAG4AYwByAG0AMgAwADEANgAuAGQAZQB2AC4AYwBoAHIAbABhAGIALgBpAG4AdAAAAAAAAAAAAAAAAACtRrU1oDZ / XXRVVEUuj0yT LI>
  • Cache-Control:max-age=0
  • Cookie:ReqClientId=42484e9a-f488-41a9-a016-1cd6e5820b3c
  • 主机:myhost....
  • 代理连接:保持活动状态
  • 升级不安全请求:1
  • User-Agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Mobile Safari/537.36

【问题讨论】:

  • 当您通过 Chrome 发出请求时,您是否使用 DevTools 查看请求实际包含的内容?标头等
  • @MariaInesParnisari 请查看包含该信息的更新问题。非常感谢您的帮助
  • 通过邮递员进行请求时,您是否尝试添加带有授权的标头:协商?
  • 只添加相同的标题?结果相同
  • 你在chrome请求中看到的cookie添加了吗?

标签: c# http postman http-get dynamics-crm-2016


【解决方案1】:

您调用的服务器似乎需要 RFC 4559 (https://www.rfc-editor.org/rfc/rfc4559) 身份验证。更多细节在这里:https://en.wikipedia.org/wiki/SPNEGO

在来自浏览器的 GET 请求情况下的工作方式:

  1. 浏览器请求所需页面
  2. 服务器响应 HTTP 401(未授权)并提供响应头 WWW-Authenticate: Negotiate。这告诉浏览器需要 RFC 4559 身份验证。
  3. 浏览器确保站点具有此操作的权限(有关配置的详细信息:https://ping.force.com/Support/PingFederate/Integrations/How-to-configure-supported-browsers-for-Kerberos-NTLM)。大多数网站在未明确列入白名单的情况下不得请求此类授权。
  4. 如果允许,浏览器会从域的 Active Directory 请求 Kerboros 票证。
  5. Active Directory 以票证响应。
  6. 浏览器将代码转发到服务器(通过您看到的 Authotizarion: Negotiate xxxxx 标头)。
  7. 服务器与同一个 Active Directory 交互并将该票证转换为用户名和组/权限信息。

如果您尝试对服务器(可能是内部/内联网公司站点)自动请求,我不知道有什么工具可以让您执行此操作(模拟浏览器)。您最好的做法可能是某种形式的脚本(如 VBS),它将通过 COM 使用 IE,并可能为您处理此身份验证(我还没有这样做,所以不确定它是否确实有效)。

【讨论】:

    【解决方案2】:

    首先,登录 CRM 并将标签留在原处。

    进入邮递员

    启用拦截器(见图)

    输入网址并点击发送,就像这样。 POSTMan 会自行处理 cookie 和标头,您会看到结果。

    如果您从 CRM 注销,POSTMan 显然将无法再发出请求,而是返回 401。

    【讨论】:

    • 您的意思是使用浏览器登录crm并使用浏览器的邮递员插件吗?还是您的意思是从 postman 独立客户端登录 crm?
    • 我想补充一点,我现在已经从 POSTMan 搬到了 Boomerang,因为我更喜欢它。答案同样适用。
    • 我向你保证,你将回到 postman,它在 stackoverflow 上有 2500 个问题,而回旋镖为 15
    • 我经常来回切换以寻找更好的工具,所以很有可能。这并不重要,只要工作顺利完成即可。
    • 你更喜欢回旋镖的哪一点?
    【解决方案3】:

    您正在尝试从 postman chrome 扩展程序或通过您系统上安装的 postman(基于 windows)的应用程序访问。尝试从 chrome 扩展程序获取数据。

    【讨论】:

      【解决方案4】:

      尝试在您的网址周围加上引号:

      curl '[org]/api/data/v8.1/accounts?$select=name,accountid&$top=3'
      

      &、$、= 等可能会导致问题 - 我遇到了同样的问题,解决方法是加引号

      【讨论】:

        【解决方案5】:

        我使用了以下步骤,没问题。请按照以下步骤操作:

        1. 打开谷歌浏览器
        2. 安装邮递员Extention
        3. 安装 Postman 的 Interceptor 扩展
        4. 打开邮递员Extention
        5. 使用Sync
        6. 使用Interceptor

        【讨论】:

          【解决方案6】:

          这些对我有帮助。

          1. 在邮递员和托管它的页面中检查它是否是 NTLM 身份验证。

          2. 使用方法贴

          3. 用户名和密码(您已设置,不必是访问密钥)

          【讨论】:

          • 仅代码的答案被认为是低质量的:请务必说明您的代码的作用以及它如何解决问题。如果您可以在帖子中添加更多信息,它将帮助提问者和未来的读者。另请参阅解释完全基于代码的答案:meta.stackexchange.com/questions/114762/…
          【解决方案7】:

          这解决了我的问题。 在 Postman 中,我从 Authorization 选项卡中复制了 Access Token,并选择了“No Auth”类型。 然后,我转到 Headers 选项卡,在 Headers 部分下,我提供了名称为“Authorization”的新密钥,并在 Value 中传递了我的 TOKEN 前缀和 Bearer.See the below screenshot

          【讨论】:

            【解决方案8】:

            如果请求来自浏览器,则没有使用身份验证。
            因此,在 Postman 中,对于身份验证,请使用 No Auth。 :-)

            【讨论】:

              猜你喜欢
              • 2016-07-11
              • 2018-06-30
              • 2021-03-24
              • 2021-11-12
              • 1970-01-01
              • 2017-08-04
              • 2020-07-31
              • 1970-01-01
              • 2020-07-09
              相关资源
              最近更新 更多