我对 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);
})
}
}