запрос.user.displayname неопределенный Nodejs passport = google oauth

#node.js #express #passport.js #passport-google-oauth

#node.js #экспресс #passport.js #паспорт-google-oauth

Вопрос:

Я пытаюсь получить доступ к req.user.DisplayName после входа в систему, но я получаю неопределенный. Есть что-то, чего мне не хватает?

 ├── config
│   └── passport.js
├── controllers
│   ├── index.controllers.js
│   └── users.controllers.js
├── helpers
│   └── auth.js
├── models
├── public
├── routes
│   ├── index.routes.js
│   └── users.routes.js
├── server.js
└── views
 

config/passport.js ;

 const { use } = require('passport');
const passport = require('passport')
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const User = require('../models/user');

passport.serializeUser((user, done) => {
  done(null, user.id);
})

passport.deserializeUser((user, done) => {
  done(null, user);
})

passport.use(new GoogleStrategy({
  clientID: 'blablablablablabla',
  clientSecret: 'blablablabla',
  callbackURL: "http://localhost:4000/google/callback",
  passReqToCallback: true
},
  async (req, token, refreshToken, profile, done) => {
    const newUser = {
      googleId: profile.id,
      displayName: profile.displayName,
      firstName: profile.name.givenName,
      lastName: profile.name.familyName,
      image: profile.photos[0].value,
    }

    try {
      let user = await User.findOne({ googleId: profile.id })

      if (user) {
        done(null, user)
      } else {
        user = await User.create(newUser)
        done(null, user)
      }
    } catch (err) {
      console.error(err)
    }
  }
));
 

Я пытаюсь получить доступ к req.user.DisplayName после входа в систему (перенаправить на ‘/’ и передать req.user.DisplayName для отображения в представлении ejs)

controllers/index.controllers.js

 const index_controller = {};

index_controller.renderHome = async (req, res) => {
    res.render('home', { username: req.user.displyaName })
};
 

routes/index.routes.js

 const { renderHome } = require('../controllers/index.controllers')

const { isAuth } = require('../helpers/auth')

router.get('/', isAuth, renderHome);
 

routes/users.routes.js

 router.get('/google/callback',
  passport.authenticate('google', { failureRedirect: '/login' }), (req, res) => {
    // res.send(req.user)
    res.redirect('/');
  });
 

😣😣

Также вы можете найти весь код здесь: https://github.com/fcarreon/google-test

Ответ №1:

Согласно документации (здесь), вы должны использовать :

 passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
});
 

Вы используете один и тот же код как для сериализации, так и для десериализации пользователя.