【发布时间】:2020-02-03 07:40:32
【问题描述】:
根据 Google 文档,“allAuthenticatedUsers”成员将包括经过身份验证的任何人,包括常规 gmail 帐户。所以我给了那个成员“云函数调用者”角色,认为任何经过身份验证的用户都应该能够调用我的谷歌云函数。那是行不通的。我得到以下结果:
错误:禁止您的客户端无权从此服务器获取 URL /function-1。
我已经证明,如果我将“Cloud Functions Invoker”角色授予“allUsers”,则可以调用该函数。所以我知道该功能有效(它是谷歌云创建的默认功能)。
那么为什么不授予“allAuthenticatedUsers”成员“Cloud Functions Invoker”角色对谷歌云功能起作用?我错过了什么?
谢谢
【问题讨论】:
-
你如何测试这个?您在请求中添加了哪些标头?您的代码/应用程序需要将 HTTP 标头
Authorization: Bearer IDENTITY_TOKEN添加到请求中。使用发出请求的客户端的代码或使用标头捕获 HTTP 请求来编辑您的问题。 -
我做了两个测试。第一个使用邮递员,我通过使用我在项目下创建的 oauth 客户端获取访问令牌。令牌作为不记名令牌发送。那没有用。我的第二个测试是简单地转到 chrome,登录到 google,然后调用函数的 URL。我还没有编写客户端代码,因为我无法通过邮递员使其工作。
-
您使用的两种方法均无效。对于第一种方法,您需要使用身份令牌,您使用了访问令牌。对于第二种方法,Chrome 在调用您的端点时不会添加身份令牌。添加 Authorization 标头是您必须编码并包含在 HTTP 请求中的内容。对于浏览器,这意味着编写 Javascript。请注意我对身份令牌的强调。访问令牌将不起作用。
-
@JohnHanley 非常感谢!有用。我之前尝试身份令牌时一定做错了什么。该令牌现在可能已经过期,这就是我的尝试在 10 分钟前失败的原因。我刚得到一个新令牌,它起作用了 :) 所以这里的关键是使用 id_token 而不是 access_token 非常感谢!
-
@mj21 你能告诉我你是如何获得 ID 令牌的吗?我们正在使用 firebase.auth().currentUser.getIdToken().then(token ... 并将其发送到 Authorization: Bearer {token} 标头中,但仍然出现 403 错误,所以我们最终不得不给出allUsers 的调用者角色:(
标签: google-cloud-platform oauth-2.0 google-cloud-functions