对需要身份验证的云运行服务的 Ajax 请求

Posted

技术标签:

【中文标题】对需要身份验证的云运行服务的 Ajax 请求【英文标题】:Ajax request to cloud run service that requires authentication 【发布时间】:2019-09-16 06:29:16 【问题描述】:

我遇到了与谷歌云有关的 CORS 相关问题,该服务运行在 需要身份验证。

如果我尝试通过 cli 使用 Bearer 令牌执行 curl 命令, 一切正常。 不幸的是,如果我尝试在 javascript 中通过 ajax 执行相同的调用, 我收到了 403。

  const http = new XMLHttpRequest();
  const url = 'https://my-app.run.app';

  http.open("GET", url);
  http.withCredentials = true;
  http.setRequestHeader("authorization", 'Bearer ' + id_token);
  http.send();
  http.onreadystatechange = (e) => 
    console.log(http.responseText)
  

云运行日志中的错误是这样的:

The request was not authenticated. Either allow unauthenticated invocations or set the proper Authorization header. Read more at https://cloud.google.com/run/docs/securing/authenticating

容器永远不会被击中。

我看到的问题是,当我在网络中使用 ajax 进行调用时 浏览器。网络浏览器正在发出飞行前请求( url )而不发送授权标头(这是预期的 行为)

问题似乎是云运行尝试验证 OPTIONS 请求并且永远不会到达我的容器,据我所知, 不应该这样做。 (https://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0)

这是云运行的已知问题吗?

如何向经过身份验证的云运行服务发出 ajax 请求?

【问题讨论】:

【参考方案1】:

(云运行 PM)

这是一个已知问题。有几个选项:

    允许未经身份验证的请求并自行执行 CORS/身份验证
      有一个变体,它在您的计算前面使用Cloud Endpoints running on Cloud Run。让 Endpoints 对您的最终用户进行身份验证,然后将请求转发到您的后端。
    从同一个域提供服务(例如,使用Firebase Hosting proxy)

我们已经考虑实现Istio CORSPolicy,它将在身份验证检查之前返回 CORS 标头,但我们目前尚未承诺这样做。

【讨论】:

firebase 托管代理似乎是一个合理的解决方法。谢谢

以上是关于对需要身份验证的云运行服务的 Ajax 请求的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的服务器会忽略来自 ajax 请求的身份验证标头?

通过 Ajax 请求时完成 OpenIDConnect 身份验证

HTTP 请求未经客户端身份验证方案“协商”的授权。从服务器收到的身份验证标头是“NTLM”

使用带有摘要身份验证、jquery ajax 调用的 RestFul PHP Web 服务

Azure API 服务器未能对请求进行身份验证

XML-RPC 的非交互式身份验证/授权?