0

我正在尝试在 Cloud Functions 前面使用 API Gateway,但是当 Cloud Functions 不可公开访问时会收到 401 响应。

我将网关设置为使用默认 AppEngine 服务帐户身份 ( project-id @appspot.gserviceaccount.com),并在 IAM 中为服务帐户赋予Cloud Functions Invoker角色。我还可以在 Cloud Functions Permissions 选项卡下的调用程序中看到它。调用网关端点时,我收到一个 401 响应,其中包含格式错误的 HTML 有效负载,显示“您的客户端无权访问请求的 URL [url]”。不幸的是,网关日志也没有指出问题所在。当我公开 Cloud Function 并等待几分钟时,调用成功。

我已阅读指南的“保护后端服务”部分几次,但看不到我遗漏了什么。

ps:这不是智威汤逊问题,那部分效果很好

4

1 回答 1

2

找到了问题的根源:aud是内部 JWT 中的声明。我想利用 Cloud Functions 的灵活可寻址性,例如,一个名为a处理每个以 . 开头的请求的函数a/...。在我的示例中,调用了该函数hello,我想/hello/example从网关调用它。

内部 JWT 将 Audience 声明设置为 OpenAPI 规范 ( https://...cloudfunctions.net/hello/example) 中给出的地址,该地址与 Cloud Function 的基本 URL 不完全匹配(仅https://...cloudfunctions.net/hello)。因此,Cloud Functions 授权方会拒绝 JWT,即使 Audience 是此函数实际提供的有效 URL。

显而易见的解决方案是在从 API 网关调用 Cloud Functions 时不使用变量后缀。

于 2021-03-19T15:18:15.220 回答