问题描述
我正在使用passportJs Google Authetication。尽管数据库中存在一个用户,但是当我使用该用户登录系统时,它会在数据库中再次以新用户的身份创建该用户。我该如何解决此问题,您能帮忙吗? 那是数据库的图像: https://i.stack.imgur.com/tNIZJ.png
这是我的代码:
module.exports = passport.use(
new GoogleStrategy(
{
clientID: config.google.clientID,clientSecret: config.google.clientKey,callbackURL: "/auth/google/callback",},async (accesstoken,refreshToken,profile,done) => {
try {
const user = await models.User.findOne({ google: { id: profile.id } });
if (user) {
done(null,user);
} else {
const newUser = new models.User({
google: profile,isSocialAuth: true,name: profile.name.givenname,lastName: profile.name.familyName,cart: { items: [] },});
await newUser.save();
done(null,newUser);
}
} catch (error) {
done(error,null);
}
}
)
);
passport.serializeUser((user,done) => {
done(null,user._id);
});
passport.deserializeUser((id,done) => {
models.User.findById(id,(err,user) => done(err,user));
});
我的路由器:
router.get("/auth/google",passport.authenticate("google",{ scope: ["profile"] }));
router.get("/auth/google/callback",{ failureRedirect: "/login" }),async (req,res) => {
req.session.user = req.user;
req.session.isAuthenticated = true;
res.redirect("/");
});
module.exports = router;
我的UserSession中间件:
module.exports = (req,res,next) => {
if (!req.session.user) {
return next();
}
models.User.findById(req.session.user._id)
.then((user) => {
req.user = user;
next();
})
.catch((err) => {
console.log(err);
});
};
解决方法
登录后,在“护照”部分中, findOne查询可能有问题。它找不到用户,因此正在重新注册。
替换
const user = await models.User.findOne({ google: { id: profile.id } });
到
const user = await models.User.findOne({ "google.id": profile.id });
&检查它是否有效。