0

我有一个与这个问题类似的问题(但有一个关键区别 - 我正在使用自己的 API):使用 Google Auth、Angular 4、ASP.Net Core 2 进行身份验证时出现 405

我正在使用 Identity Aware Proxy (IAP) 向我的企业域中的用户验证我们部署在 App Engine 柔性环境中的自定义应用程序,该应用程序是用 Node.js 编写的。该应用程序使用 express 提供资产并维护 RESTful API,并使用IAP 文档建议的签名标头授权请求。

IAP 在限制用户使用应用程序方面按预期运行,但在尝试对我自己的 RESTful API 进行 AJAX 调用时出现问题。当我尝试执行此操作时,HTTP 请求以 302 重定向响应,重定向到 Google oauth2 端点 ( https://accounts.google.com/o/oauth2/v2/auth?client_id=[...]),然后失败并出现以下错误:

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://<my_project>.appspot.com' is therefore not allowed access. The response had HTTP status code 405. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

有问题的 AJAX 是一个 POST 方法请求,但在开发工具的 Network 选项卡中,我还看到一个模仿请求到与 GET 请求相同的端点(相同的标头,只是去掉了有效负载),然后是 OPTIONS 请求到OAuth 端点(由于 OAuth 不处理 OPTIONS 预检请求而生成错误)。

在此处输入图像描述

我已经严格按照 IAP 和 App Engine 文档进行操作,因此我怀疑我在实现方面遗漏了文档所暗示的某些内容,而我忽略了这些内容。我需要以不同的方式处理 AJAX 身份验证吗?为什么它被发送到 OAuth 端点?这与我的 CORS 配置有关吗?

我尝试使用cors清除缓存、不同的设备/浏览器、各种 CORS 配置。

为什么请求失败对我来说是有道理的,但我不明白为什么首先提出请求。我了解 CORS 的限制,但我没有(直接)向 Google 服务发送请求,而是向我自己的 RESTful API(尽管托管在 Google 服务上并在 IAP 后面)发送请求。如果用户已经通过身份验证进入我的应用程序并通过 IAP,在我看来,AJAX 请求也应该进行身份验证?

4

1 回答 1

4

我的问题的解决方案是我最初怀疑的:IAP 授权过程实际上允许 AJAX 请求访问其他受 IAP 保护的资源(例如,本例中的我的后端 API)。该问题与fetch()前端客户端上的方法有关,该方法默认情况下不会随 HTTP 请求发送 cookie。您必须通过credentials: 'include'credentials: 'same-origin'在选项中获取。

默认情况下,fetch 不会从服务器发送或接收任何 cookie,如果站点依赖于维护用户会话(要发送 cookie,必须设置凭据 init 选项),则会导致未经身份验证的请求。

https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

于 2018-05-09T20:04:29.567 回答