App Engine Identity Aware Proxy AJAX 请求因 HTTP 代码 405 而失败
App Engine Identity Aware Proxy AJAX requests failing with HTTP code 405
我有一个与这个问题类似的问题(但有一个关键的区别 - 我正在打我自己的API):405 when authenticating using Google Auth, Angular 4, ASP.Net Core 2
我正在使用 Identity Aware Proxy (IAP) 对我企业域中的用户进行身份验证,以访问我们部署在 App Engine 灵活环境中的自定义应用程序,该应用程序是用 Node.js 编写的。该应用程序正在使用 express 提供资产并维护 RESTful API,并按照 IAP docs.
的建议使用已签名的 headers 授权请求
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 方法请求,但在开发工具的“网络”选项卡中,我还看到一个模拟请求到与 GET 请求相同的端点(相同 headers,只是去除了有效负载),然后是对 OAuth 端点的 OPTIONS 请求(由于 OAuth 不处理 OPTIONS 预检请求而生成错误)。
我已严格按照 IAP 和 App Engine 文档进行操作,因此我怀疑我在实施方面遗漏了文档暗示的某些内容,但我忽略了。我需要以不同方式处理 AJAX 身份验证吗?为什么它被发送到 OAuth 端点?这与我的 CORS 配置有关吗?
我已尝试清除缓存、不同的 devices/browsers、使用 cors 的各种 CORS 配置。
请求失败的原因对我来说很有意义,但我不明白为什么首先要发出请求。我了解 CORS 限制,但我不会(直接)向 Google 服务发送请求,而是向我自己的 RESTful API 发送请求(尽管托管在 Google 服务和 IAP 背后)。如果用户已经通过身份验证可以进入我的应用程序并通过 IAP,在我看来 AJAX 请求也应该经过身份验证?
我的问题的解决方案是我最初怀疑的:IAP 授权过程实际上允许 AJAX 请求访问其他受 IAP 保护的资源(例如本例中我的后端 API)。该问题与前端客户端上的 fetch()
方法有关,默认情况下该方法不会随 HTTP 请求发送 cookie。您必须在要获取的选项中传递 credentials: 'include'
或 credentials: 'same-origin'
。
By default, fetch won't send or receive any cookies from the server,
resulting in unauthenticated requests if the site relies on
maintaining a user session (to send cookies, the credentials init
option must be set).
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
我有一个与这个问题类似的问题(但有一个关键的区别 - 我正在打我自己的API):405 when authenticating using Google Auth, Angular 4, ASP.Net Core 2
我正在使用 Identity Aware Proxy (IAP) 对我企业域中的用户进行身份验证,以访问我们部署在 App Engine 灵活环境中的自定义应用程序,该应用程序是用 Node.js 编写的。该应用程序正在使用 express 提供资产并维护 RESTful API,并按照 IAP docs.
的建议使用已签名的 headers 授权请求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 方法请求,但在开发工具的“网络”选项卡中,我还看到一个模拟请求到与 GET 请求相同的端点(相同 headers,只是去除了有效负载),然后是对 OAuth 端点的 OPTIONS 请求(由于 OAuth 不处理 OPTIONS 预检请求而生成错误)。
我已严格按照 IAP 和 App Engine 文档进行操作,因此我怀疑我在实施方面遗漏了文档暗示的某些内容,但我忽略了。我需要以不同方式处理 AJAX 身份验证吗?为什么它被发送到 OAuth 端点?这与我的 CORS 配置有关吗?
我已尝试清除缓存、不同的 devices/browsers、使用 cors 的各种 CORS 配置。
请求失败的原因对我来说很有意义,但我不明白为什么首先要发出请求。我了解 CORS 限制,但我不会(直接)向 Google 服务发送请求,而是向我自己的 RESTful API 发送请求(尽管托管在 Google 服务和 IAP 背后)。如果用户已经通过身份验证可以进入我的应用程序并通过 IAP,在我看来 AJAX 请求也应该经过身份验证?
我的问题的解决方案是我最初怀疑的:IAP 授权过程实际上允许 AJAX 请求访问其他受 IAP 保护的资源(例如本例中我的后端 API)。该问题与前端客户端上的 fetch()
方法有关,默认情况下该方法不会随 HTTP 请求发送 cookie。您必须在要获取的选项中传递 credentials: 'include'
或 credentials: 'same-origin'
。
By default, fetch won't send or receive any cookies from the server, resulting in unauthenticated requests if the site relies on maintaining a user session (to send cookies, the credentials init option must be set).
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch