我正在使用 Firebase 构建一个应用,该应用需要用户之间进行私有(private)消息传递。 我需要的是为一对一聊天构建单个聊天,并将消息存储在 Firestore 中。
我的想法:我想最好的方法是为每个聊天构建一个集合,并使用正确的安全规则。假设 tokenID 为 1234 的用户想要与 tokenID 1111 的用户对话,将创建一个名为 1234_1111 的新集合(如果不存在),并且安全性将只允许这两个用户读取和写入。
我的问题:这是正确的方法吗?以及如何在 JavaScript 中做到这一点?我不确定如何直接在 JS 代码中定义安全规则,也不知道如何使用两个用户 ID 创建集合。
最佳答案
安全规则未在您的 JavaScript 代码中定义,它们是 defined separately 。尽管我会使用子集合,但您建议采取的方法是合理的,并且您的安全规则的简化版本可能如下所示:
service cloud.firestore {
match /databases/{database}/documents {
match /dms/{idPair}/messages/{msgId} {
allow read, write: if
idPair.split('_')[0] == request.auth.uid ||
idPair.split('_')[1] == request.auth.uid;
}
}
}
然后在你的 JS 代码中你可以做一些类似的事情:
// generate idPair
function dmCollection(uid) {
const idPair = [firebase.auth().currentUser.uid, toUid].join('_').sort();
return firebase.firestore().collection('dms').doc(idPair).collection('messages');
}
// send a DM
function sendDM(toUid, messageText) {
return dmCollection(toUid).add({
from: firebase.auth().currentUser.uid,
text: messageText,
sent: firebase.firestore.FieldValue.serverTimestamp(),
});
}
// retrieve DMs
function messagesWith(uid) {
return dmCollection(uid).orderBy('sent', 'desc').get();
}
请注意,idPair
是通过连接一对已排序的 UID 来构造的,因此无论哪个用户发送它都会保持稳定。
关于javascript - 在 Firebase 和 Javascript 中构建私有(private)聊天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59601952/