首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >passportJS: req.user返回未定义

passportJS: req.user返回未定义
EN

Stack Overflow用户
提问于 2019-08-07 21:31:41
回答 1查看 564关注 0票数 0

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

代码语言:javascript
复制
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)
   }
 }))

这是passport-google-oauth2

代码语言:javascript
复制
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)
  }

}))

下面是路由配置

代码语言:javascript
复制
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('/');
 });

那么这段代码到底出了什么问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-07 23:08:07

问题是你不能在deserializeUser中为user执行await

代码语言:javascript
复制
const user = User.findById(id)

您需要使用来自User.findByIdthenawait结果。所以你的deserializeUser代码应该是

代码语言:javascript
复制
passport.deserializeUser(async (id,done) => {
    const user = await User.findById(id)
    done(null, user)
 })
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57395696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档