0

我有简单的 passport-facebook 和 google oauth 应用程序,它可以工作,但是我猜它没有正确序列化用户,因为当我登录时req.user它返回未定义。这是我的 facebook oauth 代码

passport.serializeUser((user,done)=>{
  done(null,user.id)
})
passport.deserializeUser((id,done)=>{
   const user = User.findById(id)
   done(null, user)
})
 passport.use(new FacebookStrategy({
    clientID: process.env.FB_CLIENT_ID,
    clientSecret: process.env.FB_CLIENT_SECRET,
    callbackURL: "http://localhost:3000/auth/facebook/callback"
  },
  async (accessToken, refreshToken, profile, done) => {
  const user = await User.findOne({ userId: profile.id })
  if(user){
    console.log('existing user '+ user)
    return done(null,user)
  }else{
   const newuser = User.create({ username: profile.displayName,userId: profile.id });
   console.log(newuser.toString())
   done(null,newuser)
   }
 }))

这是护照-谷歌-oauth2

passport.serializeUser((user,done)=>{
   done(null,user.id)
})
passport.deserializeUser((id,done)=>{
    const user = User.findById(id)
    done(null, user)
 })
passport.use(new GoogleStrategy({
    clientID: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    callbackURL: "http://localhost:3000/auth/google/callback"
  },
  async (accessToken, refreshToken, profile, done) => {
     const user =await User.findOne({ userId: profile.id })
       if(user){
         console.log('existing user '+ user )
         return done(null,user)
       }else{
         const newuser = User.create({ username: profile.displayName,userId: 
 profile.id });
   console.log(newuser)
   done(null,newuser)
  }

}))

这是路线配置

router.get('/facebook', passportFacebook.authenticate('facebook'));

router.get('/facebook/callback',passportFacebook.authenticate('facebook', { failureRedirect: '/auth/login' }),
 function(req, res) {
  res.redirect('/');
 });
 router.get('/google',
  passportGoogle.authenticate('google', { scope: 'profile' }));
  router.get('/google/callback',passportGoogle.authenticate('google', { 
  failureRedirect: '/auth/login' }),
  function(req, res) {
   res.redirect('/');
 });

那么这段代码有什么问题呢?

4

1 回答 1

1

问题是你不await适合userin deserializeUser

const user = User.findById(id)

您需要使用thenawaitUser.findById. 所以你的deserializeUser代码应该是

passport.deserializeUser(async (id,done) => {
    const user = await User.findById(id)
    done(null, user)
 })
于 2019-08-07T15:08:06.810 回答