当前位置: 首页 > 知识库问答 >
问题:

云运行+云endpoint+服务帐户身份验证-在curl中工作,但在JS中使用fetch API时不工作

俞子实
2023-03-14

我已经配置了一个执行GCF的云endpoint。当云运行服务允许allusers调用API时,一切都很好。

Chrome JS控制台显示以下错误消息:

CORS策略阻止了从'https://.run.app/do-this&key='from origin'http://0.0.0.0:8080'获取访问:对飞行前请求的响应未通过访问控制检查:请求的资源上没有'access-control-allog-origin'标头。如果一个不透明的响应满足您的需要,请将请求的模式设置为“no-cors”,以便在禁用CORS的情况下获取资源。

这是我在浏览器中运行的JS代码:

        let options: RequestInit = {
            headers: {
                'Authorization': `Bearer ${token}`,
            },
        }
        
        const result = await fetch(fetchURL, options);

当用相同的令牌运行curl时,我得到了预期的响应

curl -H "Authorization: Bearer ${token}" 'https://<my-api>.run.app/do-this&key=<key>'

为了完整起见,这里还有endpointyaml

swagger: '2.0'
info:
  title: My first widget
  description: This is a great widget
  version: 1.0.0
host: <my-api>.run.app
schemes:
  - https
produces: 
  - application/json
paths:
  /do-this:
    get:
      summary: Do-this
      operationId: doit
      x-google-backend:
        address: https://<project-id>.cloudfunctions.net/do-that
      responses:
        '200':
          description: A successful response.
          schema:
            type: string
        '403':
          description: An error occurred
          schema:
            type: string
      security:
        - api_key: []

securityDefinitions:
  # This section configures basic authentication with an API key.
  api_key:
    type: "apiKey"
    name: "key"
    in: "query"
gcloud run services update <my-api> --set-env-vars="^|^ENDPOINTS_SERVICE_NAME=<my-api>.run.app|ESP_ARGS=--rollout_strategy=managed,--cors_preset=basic" --project=<project-id> --platform=managed --region=europe-west1

Google文档提到应该可以从GCP外部调用

如果您从无法访问计算元数据的计算实例(例如您自己的服务器)调用服务,则必须手动生成适当的令牌:
自签名一个服务帐户JWT,并将target_adiudies声明设置为接收服务的URL。将自签名的JWT交换为谷歌签名的ID令牌,该ID令牌应该将aud声明设置为上述URL。在对服务的请求中的Authorization:Bearer ID_TOKEN标头中包括ID令牌。尽管识别代理还不支持云运行(完全托管),但您可以查看识别代理示例代码,了解上面步骤的代码示例。

最终用户部分:提到CORS

共有1个答案

邢洋
2023-03-14

cors没有为云endpoint激活。按以下方式更新openAPI规范

swagger: '2.0'
info:
  title: My first widget
  description: This is a great widget
  version: 1.0.0
host: <my-api>.run.app
x-google-endpoints:
- name: <my-api>.run.app
  allowCors: True
...
...
...

或者设置no-corscheck in您的呼叫,如错误消息所述。

 类似资料:
  • 这是服务到服务身份验证中概述的规则的一个例外吗?该规则规定需要设置为接收服务的url(例如https://xxxxx.run.app)。和是一回事吗? 最后,除了使用googlecloudsdk(即imaging不存在)之外,是否还有其他方法使用用户帐户而不是服务帐户进行身份验证?

  • 这是一个很好的OAuth2用例吗?还是OAuth2仅用于授予第三方应用程序对用户数据的访问权限? 如果OAuth2不是可行的方法:如何将用户令牌安全地传递给浏览器,并防止中间人攻击?用户令牌应该在一定时间后过期吗?

  • 问题内容: 我想在Jenkins管道中使用,因此必须首先使用Google Service帐户进行身份验证。我正在使用https://wiki.jenkins.io/display/JENKINS/Google+OAuth+Plugin,其中包含我的私钥凭据。我一直坚持将凭据加载到管道中: 我也尝试过from档案,但是没有运气。 日志显示: 问题答案: 您需要将您的“服务帐户” JSON文件作为 机

  • 将配置服务器用户名和密码存储为环境变量(在客户端和服务器中)还是使用密钥库更好?密钥库密码无论如何都存储为环境变量,那么为什么实际使用密钥库呢?还是有更好的方法在SpringCloudConfig服务器中实现身份验证?

  • 我的团队目前正在开发一个应用程序,使用Admin SDK在GCP中列出公司的域用户,用于入职和非入职目的。 我们使用一个服务帐户来完成这个任务,并且在Google Admin's advanced settings中添加了 作用域。管理SDK API被激活,我们可以在凭据区域中看到服务帐户。 当我们使用参数 和 调用https://www.googleapis.com/admin/director