浏览器中的GET请求正常工作,但在使用Postman时却收到了未经授权的错误提示。

9

我正在通过 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"
    }
  ]
}

然而,当尝试通过Postman进行相同的GET请求时,我收到了401未授权的错误提示!

我已经尝试过不带任何头信息和基本认证的方式:

Authorization:Basic Y2hybGFiXxxxxxxxxxxxxxcmQxMjM=

我做错了什么?我需要在CRM中进行哪些更改才能允许我从Postman中进行GET请求?
以下是Chrome使用的头文件(从DevTools中获取):
Accept:text / html,application / xhtml + xml,application / xml; q = 0.9,image / webp,/; q = 0.8 Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en; q = 0.8 Authorization:Negotiate TlRMTVNTUAADAAAAGAAYAIoAAABkAWQBogAAAAwADABYAAAADgAOAGQAAAAYABgAcgAAABAAEAAGAgAAFYKI4gYBsR0AAAAPai35LURprYMgYVSwMQXi / 2MAaAByAGwAYQBiAGEAZwBvAHIAZABvAG4ASABPAFUALQBXAFMALQBBAEcATwBSAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd0avVN8acJQKvlSN8hYrSgEBAAAAAAAAoBg7uZi80gEIIthtN5clBAAAAAACAAYARABFAFYAAQAUAEIAQQBOAEMAUgBNADIAMAAxADYABAAcAGQAZQB2AC4AYwBoAHIAbABhAGIALgBpAG4AdAADADIAQgBBAE4AQwBSAE0AMgAwADEANgAuAGQAZQB2AC4AYwBoAHIAbABhAGIALgBpdddddddddddddddbABhAGIALgBpAG4AdAAHAAgAoBg7uZi80gEGAAQAAgAAAAgAMAAwAAAAAAAAAAEAAAAAIAAAccTLbO5YZuNnhdCDsjPCg1YXJuNv0XuASIhHrWWBg7kKABAAAAAAAAAAAAAAAAAAAAAAAAkAPABIAFQAVABQAC8AYgBhAG4AYwByAG0AMgAwADEANgAuAGQAZQB2AC4AYwBoAHIAbABhAGIALgBpAG4AdAAAAAAAAAAAAAAAAACtRrU1oDZ / XXRVVEUuj0yT Cache-Control:max-age = 0 Cookie:ReqClientId = 42484e9a-f488-41a9-a016-1cd6e5820b3c Host:myhost .... Proxy-Connection:keep-alive Upgrade-Insecure-Requests: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

2
当您通过Chrome发送请求时,是否使用DevTools查看请求的实际内容?包括头信息等。 - Maria Ines Parnisari
@MariaInesParnisari,请查看带有该信息的更新问题。非常感谢您的帮助。 - Alex Gordon
在使用Postman发送请求时,你尝试添加一个带有Authorization: Negotiate的头部吗? - Maria Ines Parnisari
只需添加完全相同的标题吗?结果也是一样的。 - Alex Gordon
你是否添加了在 Chrome 请求中看到的 cookie? - Maria Ines Parnisari
显示剩余4条评论
9个回答

6

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

进入POSTMan

启用拦截器 (见图像) interceptor

输入URL并点击发送,就这样。POSTMan会自行处理cookie和标头,并显示结果。

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


你的意思是使用浏览器登录CRM并使用浏览器的Postman插件吗?还是指从Postman独立客户端登录CRM? - Alex Gordon
我想补充一下,我现在已经从POSTMan转到了Boomerang,因为我更喜欢它。答案同样适用于此。 - Alex
1
我向你保证,你会回到Postman的,因为它在StackOverflow上有2500个问题,而Boomerang只有15个。 - Alex Gordon
我经常来回切换以寻找更好的工具,所以这很可能是真的。但实际上并不重要,只要工作顺利完成即可。 - Alex
你更喜欢Boomerang的哪个方面? - Alex Gordon
以下是如何设置拦截器的步骤 - https://learning.postman.com/docs/sending-requests/capturing-request-data/interceptor/#installing-interceptor - sandbar

4
似乎你所调用的服务器需要 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,并可能为您处理此身份验证(我没有做过,所以不确定是否确实有效)。

1

我按照以下步骤操作成功。请按照以下步骤进行:

  1. 打开Google Chrome
  2. 安装Postman扩展程序Extention
  3. 安装Postman的Interceptor扩展程序
  4. 打开PostmanExtention
  5. 使用Sync
  6. 使用Interceptor

1

在我的.NET项目中,我在Startup.cs中有两种不同的身份验证方案。我删除了旧的身份验证方案,并添加了新的身份验证服务,这样它就可以工作了。


1
你正在尝试通过Postman Chrome扩展程序或在系统上安装的基于Windows的Postman应用程序进行访问。请尝试从Chrome扩展程序中获取数据。

0

这解决了我的问题。 在Postman中,我从授权选项卡中复制了访问令牌,并选择了“无身份验证”类型。 接下来,我移动到标题选项卡,在标题部分下提供了一个新的名称为“Authorization”的键,并在该值中传递了带有Bearer前缀的TOKEN。请参见以下屏幕截图


0

以下这些对我很有帮助。

  1. 确认在Postman和托管页面中都使用了NTLM身份验证。

  2. 使用POST方法。

  3. 输入用户名和密码(你自己设置的,不一定是访问密钥)。


1
仅提供代码的答案被认为是低质量的:请确保提供解释您的代码是如何解决问题的。如果您能在帖子中添加更多信息,将有助于提问者和未来的读者。请参阅解释完全基于代码的答案: https://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers - borchvm

0

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

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

&、$、= 等可能会导致问题 - 我遇到了同样的问题,使用引号解决了这个问题。


-2
如果请求可以从浏览器中正常工作,则没有使用身份验证。
因此,在Postman中,对于身份验证,请使用无身份验证。 :-)

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