App Engine身份识别代理AJAX请求失败,HTTP代码405

时间:2018-05-07 19:27:58

标签: ajax google-app-engine cors google-appengine-node

我遇到与此问题类似的问题(但有一个关键区别 - 我正在使用我自己的API):405 when authenticating using Google Auth, Angular 4, ASP.Net Core 2

我正在使用身份识别代理(IAP)来验证我的企业域中的用户对部署在App Engine灵活环境中的自定义应用程序进行身份验证,这些应用程序是用Node.js编写的。该应用程序使用express服务资产并维护RESTful API,并使用IAP docs建议的签名标头授权请求。

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请求相同的端点的模仿请求(相同的标头,只是剥离了有效负载),然后是OPTIONS请求OAuth端点(由于OAuth不处理OPTIONS预检请求而生成错误。)

enter image description here

我已经关注了IAP和App Engine文档,因此我怀疑我在实现方面遗漏了文档隐含的内容而我忽略了。我需要以不同方式处理AJAX身份验证吗?为什么要将其发送到OAuth端点?这与我的CORS配置有关吗?

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

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

1 个答案:

答案 0 :(得分:3)

我的问题的解决方案是我最初怀疑的: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