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

时间:2019-04-26 17:52:07

标签: ajax cors google-cloud-run

我在与某项服务相关的Google Cloud上运行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在网络中拨打电话时,
浏览器。网络浏览器正在发出飞行前请求(
上的OPTIONS url)而不发送Authorization标头(这是预期的
行为)

问题似乎是云运行试图对OPTIONS进行身份验证
请求并且永远不会将其放入我的容器,据我了解,
不应该做。 (
https://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0

云运行是否存在已知问题?

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

1 个答案:

答案 0 :(得分:3)

(云运行PM)

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

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

我们已经考虑过实现Istio CORSPolicy,尽管目前我们尚未承诺要执行此操作,但该命令将在auth检查之前返回CORS标头。