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 获取):
- 接受: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
- 授权:协商
TlRMTVNTUAADAAAAGAAYAIoAAABkAWQBogAAAAwADABYAAAADgAOAGQAAAAYABgAcgAAABAAEAAGAgAAFYKI4gYBsR0AAAAPai35LURprYMgYVSwMQXi/2MAaAByAGwAYQBiAGEAZwBvAHIAZABvAG4ASABPAFUALQBXAFMALQBBAEcATwBSAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd0avVN8acJQKvlSN8hYrSgEBAAAAAAAAoBg7uZi80gEIIthtN5clBAAAAAACAAYARABFAFYAAQAUAEIAQQBOAEMAUgBNADIAMAAxADYABAAcAGQAZQB2AC4AYwBoAHIAbABhAGIALgBpAG4AdAADADIAQgBBAE4AQwBSAE0AMgAwADEANgAuAGQAZQB2AC4AYwBoAHIAbABhAGIALgBpdddddddddddddddbABhAGIALgBpAG4AdAAHAAgAoBg7uZi80gEGAAQAAgAAAAgAMAAwAAAAAAAAAAEAAAAAIAAAccTLbO5YZuNnhdCDsjPCg1YXJuNv0XuASIhHrWWBg7kKABAAAAAAAAAAAAAAAAAAAAAAAAkAPABIAFQAVABQAC8AYgBhAG4AYwByAG0AMgAwADEANgAuAGQAZQB2AC4AYwBoAHIAbABhAGIALgBpAG4AdAAAAAAAAAAAAAAAAACtRrU1oDZ/XXRVVEUuj0yT
- Cache-Control:max-age=0
- Cookie:ReqClientId=42484e9a-f488-41a9-a016-1cd6e5820b3c
- 主机:我的主机....
- 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,像 Gecko) Chrome/57.0.2987.133 手机 Safari/537.36
您调用的服务器似乎需要 RFC 4559 (https://www.rfc-editor.org/rfc/rfc4559) authentication. More details here: https://en.wikipedia.org/wiki/SPNEGO.
在浏览器发出 GET 请求时的工作方式:
- 浏览器请求所需页面
- 服务器响应 HTTP 401(未授权)并提供响应 header WWW-Authenticate:协商。这告诉浏览器需要 RFC 4559 身份验证。
- 浏览器确保站点具有执行此操作的权限(有关配置的详细信息,请参见此处:https://ping.force.com/Support/PingFederate/Integrations/How-to-configure-supported-browsers-for-Kerberos-NTLM)。未经明确 white-listed.
,大多数网站将不允许请求此类授权
- 如果允许,浏览器会从域的 Active Directory 请求 Kerboros 票证。
- Active Directory 以票证响应。
- 浏览器将代码转发给服务器(通过您看到的 Authotizarion: Negotiate xxxxx header)。
- 服务器与同一个 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'
&、$、= 等可能会导致问题 - 我遇到了同样的问题,加上引号是解决方法
我用了下面的步骤,没问题。按照以下步骤操作:
- 打开GoogleChrome
- 安装 Postman
Extention
- 安装 Postman 的
Interceptor
扩展
- 打开 Postman
Extention
- 使用
Sync
- 使用
Interceptor
这些对我有帮助。
在 postman 和托管的页面中检查它是否是 NTLM 身份验证。
使用方法post
用户名和密码(已设置,无需是访问密钥)
这解决了我的问题。
在 Postman 中,我从授权选项卡复制了访问令牌,并选择了 "No Auth" 类型。
然后,我转到 Headers 选项卡,在 Headers 部分下,我提供了名称为 "Authorization" 的新密钥,并且在值中我已经通过 Bearer.See the below screenshot
传递了我的令牌前缀
如果浏览器的请求有效,则没有使用身份验证。
因此,在 Postman 中,对于身份验证,请使用 No Auth。 :-)
在我的 .NET 项目中,我的 Startup.cs
中有两种不同的身份验证方案。我删除了旧的并添加了它的身份验证服务并且它有效。
我正在通过 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 获取):
- 接受: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
- 授权:协商 TlRMTVNTUAADAAAAGAAYAIoAAABkAWQBogAAAAwADABYAAAADgAOAGQAAAAYABgAcgAAABAAEAAGAgAAFYKI4gYBsR0AAAAPai35LURprYMgYVSwMQXi/2MAaAByAGwAYQBiAGEAZwBvAHIAZABvAG4ASABPAFUALQBXAFMALQBBAEcATwBSAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd0avVN8acJQKvlSN8hYrSgEBAAAAAAAAoBg7uZi80gEIIthtN5clBAAAAAACAAYARABFAFYAAQAUAEIAQQBOAEMAUgBNADIAMAAxADYABAAcAGQAZQB2AC4AYwBoAHIAbABhAGIALgBpAG4AdAADADIAQgBBAE4AQwBSAE0AMgAwADEANgAuAGQAZQB2AC4AYwBoAHIAbABhAGIALgBpdddddddddddddddbABhAGIALgBpAG4AdAAHAAgAoBg7uZi80gEGAAQAAgAAAAgAMAAwAAAAAAAAAAEAAAAAIAAAccTLbO5YZuNnhdCDsjPCg1YXJuNv0XuASIhHrWWBg7kKABAAAAAAAAAAAAAAAAAAAAAAAAkAPABIAFQAVABQAC8AYgBhAG4AYwByAG0AMgAwADEANgAuAGQAZQB2AC4AYwBoAHIAbABhAGIALgBpAG4AdAAAAAAAAAAAAAAAAACtRrU1oDZ/XXRVVEUuj0yT
- Cache-Control:max-age=0
- Cookie:ReqClientId=42484e9a-f488-41a9-a016-1cd6e5820b3c
- 主机:我的主机....
- 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,像 Gecko) Chrome/57.0.2987.133 手机 Safari/537.36
您调用的服务器似乎需要 RFC 4559 (https://www.rfc-editor.org/rfc/rfc4559) authentication. More details here: https://en.wikipedia.org/wiki/SPNEGO.
在浏览器发出 GET 请求时的工作方式:
- 浏览器请求所需页面
- 服务器响应 HTTP 401(未授权)并提供响应 header WWW-Authenticate:协商。这告诉浏览器需要 RFC 4559 身份验证。
- 浏览器确保站点具有执行此操作的权限(有关配置的详细信息,请参见此处:https://ping.force.com/Support/PingFederate/Integrations/How-to-configure-supported-browsers-for-Kerberos-NTLM)。未经明确 white-listed. ,大多数网站将不允许请求此类授权
- 如果允许,浏览器会从域的 Active Directory 请求 Kerboros 票证。
- Active Directory 以票证响应。
- 浏览器将代码转发给服务器(通过您看到的 Authotizarion: Negotiate xxxxx header)。
- 服务器与同一个 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'
&、$、= 等可能会导致问题 - 我遇到了同样的问题,加上引号是解决方法
我用了下面的步骤,没问题。按照以下步骤操作:
- 打开GoogleChrome
- 安装 Postman
Extention
- 安装 Postman 的
Interceptor
扩展 - 打开 Postman
Extention
- 使用
Sync
- 使用
Interceptor
这些对我有帮助。
在 postman 和托管的页面中检查它是否是 NTLM 身份验证。
使用方法post
用户名和密码(已设置,无需是访问密钥)
这解决了我的问题。 在 Postman 中,我从授权选项卡复制了访问令牌,并选择了 "No Auth" 类型。 然后,我转到 Headers 选项卡,在 Headers 部分下,我提供了名称为 "Authorization" 的新密钥,并且在值中我已经通过 Bearer.See the below screenshot
传递了我的令牌前缀如果浏览器的请求有效,则没有使用身份验证。
因此,在 Postman 中,对于身份验证,请使用 No Auth。 :-)
在我的 .NET 项目中,我的 Startup.cs
中有两种不同的身份验证方案。我删除了旧的并添加了它的身份验证服务并且它有效。