我有一个firestore集合,每个用户都有一个文档。文档名称等于用户UID。
我写信给这些文件时有一个防火区的功能。因此,我将用户UID传递给这个firebase云函数,这样该函数就可以写入数据库(这只是一个非常简单的写入,所以我不会在这里显示它(。
这是我的js文件中的函数调用:
const saveAllTimeData = firebase.functions().httpsCallable('saveAllTimeData');
saveAllTimeData({ data: firebase.auth().currentUser.uid })
但我不太确定这是否安全。
难道不能在执行之前就让人更改firebase.auth().currentUser.uid
部分吗?f.e.输入另一个uid来更改他不应该更改的文档?
用户的UID可以安全共享,因为UID的作用就像指纹一样,可以区分和识别用户。这些不会以任何方式授予用户权限或权力,它只是一组随机的唯一字符。
使用Admin SDK,您还可以根据设计创建这些UID,允许您拥有一个自定义UID,如果需要,该UID可以代表他们的用户名。
由于您还使用了httpsCallable云函数,因此它包括一个名为context的值,该值使用auth模块中的JWT令牌。JWT令牌对用户是可解码的,并且不应该被共享。然而,httpsCallable方法通过HTTPS隧道对其进行保护,使其免受大多数劫持。
在您的函数中,您应该注意到上下文变量
exports.addMessage = functions.https.onCall((data, context) => {
// ...
});
对于onCall,上下文包含一个名为auth
的属性,其中包含解码的JWT值
// Message text passed from the client.
const text = data.text;
// Authentication / user information is automatically added to the request.
const uid = context.auth.uid;
const name = context.auth.token.name || null;
const picture = context.auth.token.picture || null;
const email = context.auth.token.email || null;
参考
- https://firebase.google.com/docs/reference/functions/providers_https_#oncall
- https://firebase.google.com/docs/reference/functions/providers_https_.callablecontext
- https://firebase.google.com/docs/auth/admin/verify-id-tokens