GET 请求在浏览器中有效,但在使用 Postman 时我得到了 Unauthorized

GET request works in browser, but I get Unauthorized when using Postman

我正在通过 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 未授权!

我试过完全不使用 headers 以及基本身份验证:

Authorization:Basic Y2hybGFiXxxxxxxxxxxxxxcmQxMjM=

我做错了什么?我是否需要在 CRM 中更改某些内容以允许我从邮递员那里执行 GET?

以下是 Chrome 使用的 headers(从 DevTools 获取):

您调用的服务器似乎需要 RFC 4559 (https://www.rfc-editor.org/rfc/rfc4559) authentication. More details here: https://en.wikipedia.org/wiki/SPNEGO.

在浏览器发出 GET 请求时的工作方式:

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

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

首先,登录 CRM 并将选项卡保留在那里。

进入 POSTMan

启用拦截器(见图)

输入 URL 并点击发送,就这样。 POSTMan 会自行处理 cookie 和 headers,您会看到结果。

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

您正在尝试从邮递员 chrome 扩展程序或通过邮递员(基于 windows)安装的应用程序访问 system.Try,以从 chrome 获取数据扩展。

尝试在您的 url:

周围加上引号
curl '[org]/api/data/v8.1/accounts?$select=name,accountid&$top=3'

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

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

  1. 打开GoogleChrome
  2. 安装 Postman Extention
  3. 安装 Postman 的 Interceptor 扩展
  4. 打开 Postman Extention
  5. 使用Sync
  6. 使用Interceptor

这些对我有帮助。

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

  2. 使用方法post

  3. 用户名和密码(已设置,无需是访问密钥)

这解决了我的问题。 在 Postman 中,我从授权选项卡复制了访问令牌,并选择了 "No Auth" 类型。 然后,我转到 Headers 选项卡,在 Headers 部分下,我提供了名称为 "Authorization" 的新密钥,并且在值中我已经通过 Bearer.See the below screenshot

传递了我的令牌前缀

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

在我的 .NET 项目中,我的 Startup.cs 中有两种不同的身份验证方案。我删除了旧的并添加了它的身份验证服务并且它有效。