如何使 http 云功能只能从云端点访问
How to make http cloud function only accessible from cloud endpoints
我的架构是:
- 我有一堆云函数 (firebase)
- 我已经使用云 运行 设置了基于 ESPv2 的云端点设置,并将云功能作为后端
- 我在 firebase 托管上有一个 SPA 运行ning 正在调用端点(15 api 个端点)
- 目前,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) 才能调用它们。
对于第一点,以私有模式部署您的函数(部署时添加 --no-allow-unauthenticated
参数)
那么,
- 创建一个专用于您的 ESPv2 服务的服务帐户(如果还没有的话)
- 使用此自定义服务帐户重新部署您的 ESPv2 服务
- 授予服务帐户
roles/cloudfunctions.invoker
- 在项目上,这意味着服务帐户将能够调用项目中的任何功能
- 或者在函数级别允许服务帐户仅调用函数的子集。当所有功能不在同一个项目中时,这特别有趣。
我的架构是:
- 我有一堆云函数 (firebase)
- 我已经使用云 运行 设置了基于 ESPv2 的云端点设置,并将云功能作为后端
- 我在 firebase 托管上有一个 SPA 运行ning 正在调用端点(15 api 个端点)
- 目前,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) 才能调用它们。
对于第一点,以私有模式部署您的函数(部署时添加
--no-allow-unauthenticated
参数)那么,
- 创建一个专用于您的 ESPv2 服务的服务帐户(如果还没有的话)
- 使用此自定义服务帐户重新部署您的 ESPv2 服务
- 授予服务帐户
roles/cloudfunctions.invoker
- 在项目上,这意味着服务帐户将能够调用项目中的任何功能
- 或者在函数级别允许服务帐户仅调用函数的子集。当所有功能不在同一个项目中时,这特别有趣。