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

Posted

技术标签:

【中文标题】GET 请求在浏览器中有效,但在使用 Postman 时我得到了未经授权【英文标题】:GET request works in browser, but I get Unauthorized when using 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添加了吗? 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

进入邮递员

启用拦截器(见图)

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

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

【讨论】:

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

    打开谷歌浏览器 安装邮递员Extention 安装 Postman 的 Interceptor 扩展 打开邮递员Extention 使用Sync 使用Interceptor

【讨论】:

【参考方案6】:

这些对我有帮助。

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

    使用方法贴

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

【讨论】:

仅代码的答案被认为是低质量的:请务必说明您的代码的作用以及它如何解决问题。如果您可以在帖子中添加更多信息,它将帮助提问者和未来的读者。另请参阅解释完全基于代码的答案: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。 :-)

【讨论】:

以上是关于GET 请求在浏览器中有效,但在使用 Postman 时我得到了未经授权的主要内容,如果未能解决你的问题,请参考以下文章

GET 请求在邮递员中有效,但在 Axios 中失败

使用 swift 4 发出 GET 请求在游乐场中有效,但在项目中无效

反应:API url 在 GET 请求中有效,但在 POST 请求中被更改

为啥在使用 file_get_contents() 时出现 500 错误,但在浏览器中有效?

我的请求在 Postman 中有效,但在浏览器中无效(React、Node、Cloudinary)

简单的 POST 请求在 Postman 中有效,但在浏览器中无效