如何使 http 云功能只能从云端点访问

How to make http cloud function only accessible from cloud endpoints

我的架构是:

  1. 我有一堆云函数 (firebase)
  2. 我已经使用云 运行 设置了基于 ESPv2 的云端点设置,并将云功能作为后端
  3. 我在 firebase 托管上有一个 SPA 运行ning 正在调用端点(15 api 个端点)
  4. 目前,API(云端点)通过 APIKey(受限)进行保护

我想保护云功能,以便只有云端点(或我项目中的其他服务)可以调用它。 直接调用这些云函数的fqdns应该会产生403/4xx。

我该如何实现?有什么办法吗?

** 我没有组织帐户,因此无法创建服务边界。

编辑

我接受了 guillaume blaquiere 的回答是正确的。虽然答案没有解决我面临的问题,但它是我提出的问题的正确答案。

万一有人遇到类似问题,我最大的错误(我浪费了 1 天的时间)是 'x-google-backend > address'。我只使用云函数的 FQDN 而不是整个 URL。所以 这是错误的:

/myfunction/mymodule1/dosomething:
    post:
      summary: I command you to do something
      operationId: doSomething
      x-google-backend:
        address: https://xxxxxxxx.cloudfunctions.net
        path_translation: APPEND_PATH_TO_ADDRESS
      parameters:
        - name: someheaderparam
          in: header
          description: shhh
          required: true
          type: string
        - name: payload
          in: body
          description: playload
          required: false
          schema:
            type: object
      responses:
        '200':
          description: OK
          schema:
            type: object
        '401':
           $ref: '#/responses/UnauthorizedError'

为此,我需要使用整个 url 函数,而不仅仅是 FQDN。

我的情况是我的 firebase/cloud 函数是一个快速应用程序,我在其中发布了这样的函数

exports.myfunction = functions.https.onRequest(app);

所以 cloudfunction 的名称是 myfunction,它的基础 url 是:

https://xxxxxxxx.cloudfunctions.net/myfunction

使用express我给它添加了几个路径,比如

app.post('/mymodule1/dosomething', validateToken(), somemethod);

如果我的函数可以公开访问,为了调用 'somemethod' 函数,url 应该是:

https://xxxxxxxx.cloudfunctions.net/myfunction/mymodule1/dosomething

为了在 api 网关后面使用 openAPI 进行映射,规范如下所示:

/mymodule1/dosomething:
    post:
      summary: I command you to do something
      operationId: doSomething
      x-google-backend:
        address: https://xxxxxxxx.cloudfunctions.net/myfunction
        path_translation: APPEND_PATH_TO_ADDRESS
      parameters:
        - name: someheaderparam
          in: header
          description: shhh
          required: true
          type: string
        - name: payload
          in: body
          description: playload
          required: false
          schema:
            type: object
      responses:
        '200':
          description: OK
          schema:
            type: object
        '401':
           $ref: '#/responses/UnauthorizedError'

即使该功能不是快捷应用,也是如此。 在 openAPI 规范中,x-google-backend 地址必须是函数的 URL 而不仅仅是云函数的 FQDN。

要做到这一点,你需要两件事

  • 首先限制对您的云功能的访问
  • 然后,您只需要允许 Cloud Endpoints 访问您的功能

像这样,可以从互联网访问该函数,但只有授权服务 (ESPv2) 才能调用它们。


  1. 对于第一点,以私有模式部署您的函数(部署时添加 --no-allow-unauthenticated 参数)

  2. 那么,

  • 创建一个专用于您的 ESPv2 服务的服务帐户(如果还没有的话)
  • 使用此自定义服务帐户重新部署您的 ESPv2 服务
  • 授予服务帐户 roles/cloudfunctions.invoker
    • 在项目上,这意味着服务帐户将能够调用项目中的任何功能
    • 或者在函数级别允许服务帐户仅调用函数的子集。当所有功能不在同一个项目中时,这特别有趣。