首页 > 解决方案 > Firebase 函数调用者权限如何工作?

问题描述

我正在尝试通过使用授权来保护我的 firebase 功能。
我写了一个非常简单的可调用函数

exports.hey= functions.https.onCall((data, context) => {

return {hello:"world"};
});

然后我部署到 GC 并将权限添加invokerallAuthenticatedUsers.
然后我去了我的应用程序并编写了一些测试代码

FirebaseFunctions.getInstance().getHttpsCallable("hey").call(null).addOnCompleteListener(task -> {
      if (task.isSuccessful()) 
         System.out.println(task.getResult().getData());
     else
          FirebaseCrashlytics.getInstance().recordException(task.getException());
        });

此代码在用户之后运行authenticateFirebaseAuth.getInstance().signInWithCustomToken();(我有自己的身份验证系统它可以工作我可以在 firebase auth 仪表板中看到经过身份验证的用户以及用户能够读取数据库的最后一次登录)但函数调用始终返回 http 403

我知道在函数中我可以使用context来检查 auth 字段并验证用户是否经过身份验证,但是在 GC 中权限系统的意义何在?如果最后我们总是需要检查context.auth我是否遗漏了什么?

W/System.err: com.google.firebase.functions.FirebaseFunctionsException: UNAUTHENTICATED

标签: node.jsgoogle-cloud-platformgoogle-cloud-functionsgoogle-iam

解决方案


如果传递给 Cloud Function 的 ID 令牌代表一个 Google 帐户,它就可以工作,否则就不行。

针对 Google Cloud Functions 的经过身份验证的客户端请求必须具有 Authorization: Bearer ID_TOKEN 标头或 ?access_token=ID_TOKEN。

Authentication 标头设置有用作上下文参数的用户 ID 令牌。Firebase 用户的 ID 令牌并不总是代表 Google 用户,这使其与allAuthenticatedUsers不兼容。因此,您检查 context.auth。否则,您可以尝试使用“allUsers”,它应该可以工作。

您可以查看此stackoverflow 答案以获取更多信息。


推荐阅读