Passport.js:验证后如何访问用户对象?

时间:2013-02-19 07:13:17

标签: node.js express

我正在使用Passport.js以用户名和密码登录用户。我基本上使用Passport站点的示例代码。以下是我的代码的相关部分(我认为):

app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser(function(user, done) {
    done(null, user);
});

passport.deserializeUser(function(obj, done) {
    done(null, obj);
});

passport.use(new LocalStrategy(function(username, password, done) {
    User.findOne({ username: username }, function(err, user) {
        if (err) {
            return done(err);
        }
        if (!user) {
            return done(null, false, { message: 'Incorrect username.' });
        }
        if (!user.validPassword(password)) {
            return done(null, false, { message: 'Incorrect password.' });
        }
        return done(null, user);
        });
    }
));

app.post('/login',
    passport.authenticate('local', { failureRedirect: '/login/fail', failureFlash: false }),
    function(req, res) {
        // Successful login
        //console.log("Login successful.");
        // I CAN ACCESS req.user here
});

这似乎正确登录。但是,我希望能够在代码的其他部分访问登录用户的信息,例如:

app.get('/test', function(req, res){
    // How can I get the user's login info here?
    console.log(req.user);  // <------ this outputs undefined
});

我已经检查了其他问题,但是我不确定我在这里做错了什么。谢谢!

7 个答案:

答案 0 :(得分:53)

派对迟到但在我自己搜索答案后发现这个没有答案。

请求内部将是一个req.user对象,您可以使用它。

这样的路线:

app.get('/api/portfolio', passport.authenticate('jwt', { session: false }), stocks.buy);

这样的控制器:

buy: function(req, res) {
      console.log(req.body);
      //res.json({lel: req.user._id});
      res.json({lel: req.user});
    }

答案 1 :(得分:5)

在引用Passport documentation时,用户对象包含在req.user中。见下文。

    app.post('/login',
      passport.authenticate('local'),function(req, res) {
       // If this function gets called, authentication was successful.
       // `req.user` contains the authenticated user.
       res.redirect('/users/' + req.user.username);
     });

这样,您就可以从重定向到的页面访问您的用户对象。

如果您遇到困难,可以参考my Github project我清楚实施的地方。

答案 2 :(得分:2)

res.render接受一个可选参数,该参数是一个包含视图局部变量的对象。

如果您使用passport并已通过身份验证,则req.user包含经过身份验证的用户。

// app.js
app.get('/dashboard', (req, res) => {
  res.render('./dashboard', { user: req.user })
})

// index.ejs
<%= user.name %>

答案 3 :(得分:0)

在注册护照中间件之前,您需要确保注册填充req.session的{​​{3}}。

例如,以下使用middleware

app.configure(function() {

  // some code ...

  app.use(express.cookieParser());
  app.use(express.bodyParser());
  app.use(express.cookieSession()); // Express cookie session middleware 
  app.use(passport.initialize());   // passport initialize middleware
  app.use(passport.session());      // passport session middleware 

  // more code ...

});

答案 4 :(得分:0)

您可以按照以下方式定义路线。

router.post('/login',
passport.authenticate('local' , {failureRedirect:'/login', failureFlash: true}),
function(req, res) {
   res.redirect('/home?' + req.user.username);
});

在上面的代码片段中,您可以访问用户对象的任何字段并将其作为“ req.user.field_name”传递给您要重定向的页面。这里要注意的一件事是,您要重定向到的页面的基本URL后应带有问号。

答案 5 :(得分:0)

我对javascript还是很陌生,但是从教程中了解到,您必须先执行一些会话middleware,如250R所示。

const session = require('express-session')
const app = express()

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

let sess = {
    genid: (req) => {
        console.log('Inside the session middleware')
        console.log(req.sessionID)
        return uuid()
    },
    store: new FileStore(),
    secret: 'keyboard cat', // password from environment
    resave: false,
    rolling: true,
    saveUninitialized: true,
    cookie: {
        HttpOnly: true,
        maxAge: 30 * 60 * 1000 // 30 minutes
    }
}

app.use(session(sess))

// call passport after configuring the session with express-session
// as it rides on top of it
app.use(passport.initialize())
app.use(passport.session())

// then you will be able to use the 'user' property on the `req` object
// containing all your session details
app.get('/test', function (req, res) {
    console.log(req.user)
})

答案 6 :(得分:0)

参加聚会,但这对我有用

在您的app.js中使用它

app.use(function(req,res,next){
  res.locals.currentUser = req.user;
  next();
})

在客户端(例如ejs)获取当前用户详细信息

<%= locals.currentUser.[parameter like name || email] %>