req.user.displayname 未定义 Nodejs + passport = google oauth

Posted

技术标签:

【中文标题】req.user.displayname 未定义 Nodejs + passport = google oauth【英文标题】:req.user.displayname undefined Nodejs + passport = google oauth 【发布时间】:2021-03-27 09:23:09 【问题描述】:

我试图在登录后访问 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

配置/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 视图中呈现)

控制器/index.controllers.js

const index_controller = ;

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

路由/index.routes.js

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

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

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

路由/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】:

根据文档 (here),您应该使用:

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

您使用相同的代码对用户进行序列化和反序列化。

【讨论】:

以上是关于req.user.displayname 未定义 Nodejs + passport = google oauth的主要内容,如果未能解决你的问题,请参考以下文章

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

idea thymeleaf 变量未定义

“注意:未定义的变量”、“注意:未定义的索引”和“注意:未定义的偏移量”使用 PHP

“注意:未定义的变量”、“注意:未定义的索引”和“注意:未定义的偏移量”使用 PHP

“注意:未定义的变量”、“注意:未定义的索引”和“注意:未定义的偏移量”使用 PHP