【发布时间】:2021-07-31 19:29:05
【问题描述】:
基本上,我有一个受 SSO 保护的在线 API (XHR)(基于 Vouch 的 OAuth 2.0)。通过 GET 请求访问 API 后,您会收到错误 302 并将您重定向到登录,然后如果成功通过身份验证,您将返回您的 API 并安全地访问资源。
我需要通过 AJAX 从“https://www.someUrl.com”源访问 XHR 资源 (XML) - 请参见下面的示例:
$.ajax({
url: "https://api.someUrl.com/xmlapi",
dataType: 'xml',
type: 'GET',
success: function(xmlDoc){
},
error: function(xmlDoc) {
console.log('Error: ' + xmlDoc.responseText);
}
});
如果 cookie 已经存在,则不会显示错误并且一切运行顺利。如果 cookie 不存在,那么我会收到 CORS 跨域错误。
如果用户未通过身份验证,“https://api.someUrl.com/xmlapi”通常会返回 302(临时重定向)。但是在 AJAX 中没有发生重定向。
开发者工具显示以下常见错误:
Access to XMLHttpRequest at 'https://api.someUrl.com/xmlapi' from origin 'https://www.someUrl.com'
has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested
resource.
我尝试更新服务器端的“Access-Control-Allow-Origin”,但没有响应。这似乎与浏览器不接受在 ajax 中重新定向有关,尽管浏览器正在考虑 CORS 问题。
在 Network 下的开发者工具中签入,这就是我所拥有的:
常规
Request URL: https://api.someUrl.com/xmlapi
Referrer Policy: strict-origin-when-cross-origin
响应标头
content-length: 145
content-type: text/html
date: Mon, 10 May 2021 10:51:09 GMT
location: https://login.someUrl.com/login?
url=https://api.someUrl.com/apixml&vouch-failcount=&X-
Vouch-Token=&error=
server: nginx/1.18.0
请求标头
:authority: api.someUrl.com
:method: GET
:path: /apixml
:scheme: https
accept: application/xml, text/xml, */*; q=0.01
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
origin: https://www.someUrl.com
referer: https://www.someUrl.com/
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-site
我的设置是这样的:
- 从www.XXX访问子域api.XXX上的资源
- api.XXX 重定向到子域 login.XXX
- 如果登录成功,重定向回api.XXX
上面的工作,但是当我将它移植到 ajax 时它没有。
目的是让 www.XXX 用户在 ajax 代码需要访问以保护 api.XXX 等资源时进行身份验证。
非常感谢任何建议。
【问题讨论】:
-
看来我必须找到一种方法来捕获 nginx 范围内的 OPTION 请求(飞行前)。这需要在授权之前完成。我必须找到一种方法来做到这一点。找到后会发布解决方案。
标签: ajax cors single-sign-on