gpt4 book ai didi

angularjs - 在更新/删除文档之前,如何检查 Passport JS 中的 req.user 中的 userID 和 MongdoDB userID 是否匹配?

转载 作者:太空宇宙 更新时间:2023-11-03 23:04:23 25 4
gpt4 key购买 nike

我正在为使用Passport JS进行身份验证的用户制作一个具有删除和编辑功能的投票应用程序+特定民意调查属于他/她。

我使用 Node/Express 进行了以下 Passport 设置:

 passport.use(new FacebookStrategy({ 

clientID: FACEBOOK_APP_ID,
clientSecret: FACEBOOK_APP_SECRET,
callbackURL: CALLBACK_URL

}, function(accessToken, refreshToken, profile, done){
//callback function after login

process.nextTick(function(){
done(null, profile);
});
}));


passport.serializeUser(function(user,done){

req.session.passport.user = {};

done(null, user);

});

passport.deserializeUser(function(id, done){

done(null, id);

});


app.get('/auth/facebook', passport.authenticate('facebook'));


app.get('/auth/facebook/callback', passport.authenticate('facebook', {
successRedirect: '/',
failureRedirect: '/error'

}));

app.get('/success', function(req, res, next) {

res.send('Successfully logged in. You can close this window');
});


app.get('/error', function(req, res, next) {
res.send("Error logging in.");
});

因此,现在每个请求都附加了带有 id 和 displayName 的用户 (req.user)

我使用以下中间件功能来保护路由服务器端:

var auth = function(req,res,next){

if(!req.isAuthenticated()){

console.log("You need to login!");

res.sendStatus(401);
}
else {

console.log("User is logged in, success!");
next();
}
};

民意调查以以下格式保存在 MongoDB 中:

{
"_id": {
"$oid": "57c69ec65ed24f166b4e98cf"
},
"title": "Poll Test",
"options": [
{
"option": "Option1",
"votes": 0
},
{
"option": "Option2",
"votes": 0
},
{
"option": "Option3",
"votes": 0
},
{
"option": "Option4",
"votes": 0
}
],
"userID": "1798846357",
"displayName": "John Doe",
"date": "Wed Aug 31 2016 09:09:26 GMT+0000 (UTC)"
}

我想保护我的 REST API 中的以下路由,该路由由前端的 delete poll 函数使用。

问题在于它检查用户是否经过身份验证,但不检查轮询是否属于该用户。换句话说:如果请求中的 userID 与数据库中的 userID 匹配,则不会。

我尝试在 db.collection 函数中放入 if 语句来检查 req.user.id 和 doc.data.id 是否匹配,但它不起作用。

我认为这是因为 updateOne 已经完成了。

如何使用 userID 检索民意调查,然后使用 req.user.id 进行检查,如果匹配,则继续更新?

    app.delete("/polls/:id", auth, function(req, res) {         
db.collection(POLLS_COLLECTION).deleteOne({
_id: new ObjectID(req.params.id)
}, function(err, doc) {

if (err) {

handleError(res, err.message, "Failed to delete contact");

} else {

res.status(204).end();
}
});
});
});

最佳答案

这可能对您有帮助:

回答问题

How can I retrieve the poll with the userID and then check that with the req.user.id and if match, continue with the update?

db.collectionName.updateOne({userID :  req.user.id}, {updateQuery});

如果存在 userID 与值 req.user.id 相同的文档,上述查询将更新文档。否则不会有任何更新。

希望这会有所帮助。

关于angularjs - 在更新/删除文档之前,如何检查 Passport JS 中的 req.user 中的 userID 和 MongdoDB userID 是否匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39245777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com