如果用户登录到服务器端,客户端如何知道这一点?

时间:2021-04-15 16:42:11

标签: node.js firebase authentication firebase-authentication

我对 firebase 中的规则有疑问。如果我让用户通过服务器端 Node.js 中的 firebase 连接到我的站点,我如何在客户端知道该用户当前在线?

我只希望登录的用户访问该站点。如何防止在客户端访问每个人的请求,并只允许连接的人?

我尝试使用它:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
     match /{document=**} {
       allow read, write: if request.auth != null;
     }    
  }
}

但它不起作用,而且它不起作用也是有道理的,可以做些什么,只有那些已连接的人才能在网站上使用与 firebase 相关的操作?

很长一段时间以来,我一直在努力解决这个问题,在我看来,这是一个非常简单的问题。我的代码很繁琐而且很长,我想添加它,但它会使我的问题复杂化。

我的问题是,如果用户通过服务器端连接,而我无权访问身份验证,我如何防止在客户端访问每个人的请求,并只允许某人连接?

更新:签署

exports.login = (req, res) => {
  const user = {
    email: req.body.email,
    password: req.body.password,
  };

  const { valid, errors } = validateLoginData(user);

  if (!valid) return res.status(400).json(errors);

  firebase
    .auth()
    .signInWithEmailAndPassword(user.email, user.password)
    .then((data) => {
      console.log(JSON.stringify(data));
      return data.user.getIdToken();
    })
    .then((token) => {
      db.collection('users')
        .where("email", "==", user.email)
        .get()
        .then((data) => {
          data.forEach((doc) => {

            let userHandle = doc.data().handle;
            db.collection("users")
              .doc(userHandle)
              .get()
              .then((doc) => {
                let user = doc.data();
                db.collection('users').doc(userHandle)
                  .set(user)
                  .then(() => {
                    return res.json({ token: token });
                  })
                  .catch((err) => {
                    console.error(err);
                    return res.status(500).json({ error: err.code });
                  });

              }).catch((error) => {
                console.error(error);
              });


          });
        })
        .catch((err) => {
          console.error(err);
          res.status(500).json({ error: err.code });
        });



    })
    .catch((err) => {
      console.error(err);
      return res
        .status(403)
        .json({ general: "Wrong credentials, please try again" });
    });
};

更新 2:客户端功能示例。

export const getRealtimeConversations = (user) => {
    return async dispatch => {

        const db = firebase.firestore();
        db.collection('conversations')
            .where('user_uid_1', 'in', [user.uid_1, user.uid_2])
            .orderBy('createdAt', 'asc')
            .onSnapshot((querySnapshot) => {

                const conversations = [];

                querySnapshot.forEach(doc => {
                    if (
                        (doc.data().user_uid_1 == user.uid_1 && doc.data().user_uid_2 == user.uid_2)
                        ||
                        (doc.data().user_uid_1 == user.uid_2 && doc.data().user_uid_2 == user.uid_1)
                    ) {
                        conversations.push(doc.data())
                    }

                });

                dispatch({
                    type: userConstants.GET_REALTIME_MESSAGES,
                    payload: { conversations }
                })

                //console.log(conversations);
                //return res.json(conversations);
            })
    }
}

0 个答案:

没有答案