使用 Cloud Endpoints v1 为 Cloud 运行 启用 CORS

Enable CORS for Cloud Run with Cloud Endpoints v1

我一直在关注 Medium 上的一篇文章,以在托管 REST API 的云 运行 服务前部署 Cloud Endpoints v1,并且一切正常。

我现在需要启用 CORS 支持,并且我已将以下配置添加到我的端点 YAML 文件中,但是当我的浏览器尝试进行预配置时收到错误消息“此服务不允许 CORS 流量”航班请求(我也用 Postman 测试过这个,但出现了同样的错误)。我知道有一个标志可以使用环境变量启用 CORS --cors_preset=basic,但我不确定要设置哪个键。任何想法或帮助表示赞赏。

端点 YAML 截图:

swagger: '2.0'
info:
  title: Cloud Endpoints with Cloud Run
  description: Testing Cloud Endpoints with Cloud Run
  version: 1.0.0
host: endpoint-<hash>-uc.a.run.app
x-google-endpoints:
- name: endpoint-<hash>-uc.a.run.app
  allowCors: true
schemes:
  - https
produces:
  - application/json

错误:

{
    "code": 7,
    "message": "The service does not allow CORS traffic.",
    "details": [
        {
            "@type": "type.googleapis.com/google.rpc.DebugInfo",
            "stackEntries": [],
            "detail": "service_control"
        }
    ]
}

PS: 感谢 Guillaum Blaquiere 的精彩文章。

更新: 我最终使用不完整的 URL 进行测试,因此收到上述错误,因为我的后端服务未配置为响应所有飞行前请求 URL。修复此问题后,我现在仅在 CORS 飞行前配置 URL.

上收到以下错误
{
  "code": 13,
  "message": "INTERNAL_SERVER_ERROR",
  "details": [
    {
      "@type": "type.googleapis.com/google.rpc.DebugInfo",
      "stackEntries": [
        
      ],
      "detail": "application"
    }
  ]
}

和日志:

invalid URL prefix in "", client: <CLIENT_IP>, server: , request: "OPTIONS /api/v1/<REMAINING_URL> HTTP/1.1", host: "endpoint-<HASH>-uc.a.run.app"

我会说有必要添加 ESPv2 Config,我注意到关于 ESPv2 配置的注释是从去年四月开始添加的,并且 Medium 文档是在 2019 年发布的,所以我认为这是必需的步骤之前没有提到。

稍后在同一部分中提到 cors 的标志由部署命令的“--set-env-vars”标志传递。

您可以在此处找到有关 ESPv2 Beta startup options 的更多信息。

我设法通过在我的 YAML 文件中为我已经定义的每个路径定义不安全的选项操作来解决这个问题。请参阅下面的示例 YAML 文件,了解定义了 GET 和 OPTIONS 操作的端点路径“/api/v1/hello”。

swagger: '2.0'
info:
  title: Cloud Endpoints with Cloud Run
  description: Testing Cloud Endpoints with Cloud Run
  version: 1.0.0
host: endpoint-randomhash-uc.a.run.app
x-google-endpoints:
  - name: endpoint-randomhash-uc.a.run.app
    allowCors: true
schemes:
  - https
produces:
  - application/json
x-google-backend:
  address: https://backend-randomhash-uc.a.run.app
  path_translation: APPEND_PATH_TO_ADDRESS
security:
  - auth0_jwk: []
paths:
  /api/v1/hello:
    get:
      summary: Say hello
      operationId: helloName
      parameters:
        - name: "name"
          in: "query"
          description: "Your name"
          type: "string"
      responses:
        '200':
          description: Successful operation
          schema:
            type: string
    options:
      summary: CORS pre-flight for say hello
      operationId: helloNameOptions
      parameters:
        - name: "name"
          in: "query"
          description: "Your name"
          type: "string"
      responses:
        '200':
          description: Successful operation
          schema:
            type: string
      security: []
securityDefinitions:
  auth0_jwk:
    authorizationUrl: ""
    flow: "implicit"
    type: "oauth2"
    x-google-issuer: "https://project.auth0.com/"
    x-google-jwks_uri: "https://project.auth0.com/.well-known/jwks.json"
    x-google-audiences: "firebase-application-host"

正如 Sergio 在他对 , the other option in my case is to use Firebase Hosting proxy 的评论中指出的那样,使用相同的域并避免 CORS。