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

Ajax request to cloud run service that requires authentication

我在 google 云 运行 的服务上遇到了与 CORS 相关的问题
需要身份验证。

如果我尝试使用 Bearer 令牌通过 cli 执行 curl 命令,
一切正常。 不幸的是,如果我尝试通过 ajax 在 javascript、
中执行相同的调用 我收到 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 进行呼叫时,在网络
浏览器。 Web 浏览器正在发出飞行前请求(
上的 OPTIONS url )而不发送授权 header (这是预期的
行为 )

问题似乎是云 运行 试图验证选项
请求但从未进入我的容器,据我所知,
不应该这样做。 (
https://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0 )

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

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

(云 运行 下午)

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

  1. 允许未经身份验证的请求并 CORS/auth 自己做
    1. 有一个变体,在您的计算前使用 Cloud Endpoints running on Cloud Run。让端点执行您的 end-user 身份验证,然后将请求转发到您的后端。
  2. 从同一域提供服务(例如使用 Firebase Hosting proxy

我们已经考虑实施 Istio CORSPolicy,这将 return CORS headers 在身份验证检查之前,尽管我们目前还没有致力于此。