PassportJs Google Auth 将现有用户保存为数据库中的新用户。我该如何解决?

Posted

技术标签:

【中文标题】PassportJs Google Auth 将现有用户保存为数据库中的新用户。我该如何解决?【英文标题】:PassportJs Google Auth saves existing user as a new user in the database. How can I fix that? 【发布时间】:2021-02-13 17:25:08 【问题描述】:

我正在使用 passportJs Google Authetication。尽管数据库中存在一个用户,但当我使用该用户登录系统时,它会在数据库中再次创建该用户作为新用户。我该如何解决这个问题,你能帮忙吗? 那是数据库的图像:

这是我的代码:

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", passport.authenticate("google",  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);
    );
;

【问题讨论】:

【参考方案1】:

登录后,在 Passport 部分, findOne 查询可能有一些问题。它无法找到用户,因此它正在重新注册。

替换

const user = await models.User.findOne( google:  id: profile.id  );

const user = await models.User.findOne( "google.id": profile.id );

& 检查它是否有效。

【讨论】:

以上是关于PassportJs Google Auth 将现有用户保存为数据库中的新用户。我该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

在 React/Express 中使用 PassportJS 进行 Google OAuth 时出现 CORS 错误

Nuxt auth 与passportjs?

Passport JS 和 Auth0 有啥关系?

身份验证后使用 passportjs-google 重定向到原始页面(无会话)

如何让 Google 停止在 PassportJS 中自动登录用户?

如何从 passportjs 中的刷新令牌中获取新的 Google oauth 访问令牌