9

我在
需要身份验证的服务上运行谷歌云时遇到了与 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 进行调用时。Web 浏览器正在发出飞行前请求(
URL 上的 OPTIONS)而不发送 Authorization 标头(这是预期的
行为)

问题似乎是云运行尝试对 OPTIONS
请求进行身份验证,并且从未将其发送到我的容器中,据我所知,
不应该这样做。(
https://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0

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

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

4

1 回答 1

8

(云跑 PM)

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

  1. 允许未经身份验证的请求并自己执行 CORS/auth
    1. 有一个变体,它使用在您的计算前面的Cloud Run 上运行的 Cloud Endpoints 。让 Endpoints 执行您的最终用户身份验证,然后将请求转发到您的后端。
  2. 从同一个域提供服务(例如使用Firebase 托管代理

我们已经考虑实现IstioCORSPolicy,它将在身份验证检查之前返回 CORS 标头,尽管我们目前还没有承诺。

于 2019-04-26T19:28:40.313 回答