javascript - 在 Firebase 和 Javascript 中构建私有(private)聊天

标签 javascript firebase google-cloud-firestore firebase-security

我正在使用 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/

相关文章:

Firebase 翻译文本扩展 - 是否可以翻译嵌套集合中的字段?

google-cloud-firestore - 在 Firestore 安全规则 str.matches(regex) 中将 "i"标志放在哪里?

javascript - 如何删除firestore集合数据库中的所有文档

删除所有文件后 Firebase 存储状态已满

android - Firebase 动态链接广告系列跟踪不起作用

ios - 没有收到从 FCM 到 iOS Swift 3 的推送通知

javascript - window.print() 在 chrome 中工作但在 safari 中不起作用

javascript - 如何在js中迭代这个对象?

javascript - 使用 javascript 显示元素的转换后的鼠标坐标

javascript - jQuery 没有运行