状况:
目前,我通过网址将UID传递给服务器。
然后我使用UID检查数据库中是否存在该UID:
CODE:
router.get("/profile/:uid", function(req, res, next){
var uid = req.params.uid;
var userRef = admin.database().ref("users/"+uid);
userRef.once('value', function(snapshot){
if (snapshot != null) {
问题:
这意味着任何人都可以通过构建网址并将其粘贴到搜索栏并包含该用户的UID来访问任何人的个人资料。
问题:
如何在没有此类安全漏洞的情况下检查用户是否在服务器上进行了身份验证?
答案 0 :(得分:5)
您需要传递身份验证令牌而不是uid。在身份验证过程之后,您将从Firebase获取uid,而不是来自用户。
使用Firebase管理SDK验证ID令牌
网络
firebase.auth().currentUser.getToken(/* forceRefresh */ true).then(function(idToken) {
// Send token to your backend via HTTPS
// ...
}).catch(function(error) {
// Handle error
});
服务器(NodeJs)
// idToken comes from the client app (shown above)
admin.auth().verifyIdToken(idToken)
.then(function(decodedToken) {
var uid = decodedToken.uid;
// here you can use the uid of the user without the fear of Forgery
}).catch(function(error) {
// Handle error
});
来源: https://firebase.google.com/docs/auth/admin/verify-id-tokens
答案 1 :(得分:1)
您可以定义“身份验证”中间件并将其安装在您要授权的任何路由上:
var authenticate = function(req, res, next) {
var token = req.cookies.token;
if ( token ) {
firebase
.auth()
.verifyIdToken(token)
.then(function(decodedToken) {
var uid = decodedToken.sub;
if ( uid === req.params.uid ) {
next()
} else {
console.log('This page is personal');
}
})
.catch(function(err) {
res.redirect('/login');
});
} else {
res.redirect('/login');
}
};
并使用它如下:
router.get("/profile/:uid", authenticate, function(req, res, next){
var uid = req.params.uid;
var userRef = admin.database().ref("users/"+uid);
userRef.once('value', function(snapshot){
if (snapshot != null) {