node.js - Firebase 函数调用者权限如何工作?
问题描述
我正在尝试通过使用授权来保护我的 firebase 功能。
我写了一个非常简单的可调用函数
exports.hey= functions.https.onCall((data, context) => {
return {hello:"world"};
});
然后我部署到 GC 并将权限添加invoker
到allAuthenticatedUsers
.
然后我去了我的应用程序并编写了一些测试代码
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
解决方案
如果传递给 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 答案以获取更多信息。
推荐阅读
- python - 试图从 webelements 列表中提取文本,但我只得到第一个
- forms - Vue.js 重用表单验证规则
- ssl - 解密由于 JMeter https 请求(例如通过 Wireshark)生成的“加密警报”数据包
- dockerfile - 为什么运行时会出现 chown:在 `/usr/local/hadoop/logs' 之后缺少操作数
- git - 有没有办法从数据目录中恢复 gitlab 存储库,如下所示?
- node.js - 过程或函数 insert_azienda 指定了太多参数 (Node.js)
- hyperledger-fabric - 如何创建频道更新提案以及如何签名
- android - 如何执行方法onClick?
- jwt - 使用 java 库 auth0-java 为 JitsiMeet 生成 jwt 令牌
- excel - 当 sheet1 中的新数据输入更改另一个 sheet2 中的单元格值时自动弹出