43

我正在使用 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
});

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

4

7 回答 7

70

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

请求内部将是一个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});
    }
于 2015-10-30T01:40:11.587 回答
11

参考Passport 文档,用户对象包含在 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);
     });

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

万一你卡住了,你可以参考我的 Github 项目,在那里我清楚地实现了它。

于 2017-03-01T17:29:13.940 回答
2

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

如果您使用护照并且已经对用户进行了身份验证,则req.user包含经过身份验证的用户。

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

// index.ejs
<%= user.name %>
于 2020-02-24T21:42:17.480 回答
1

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

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

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

于 2019-04-10T19:25:24.567 回答
1

我对 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)
})
于 2020-02-11T11:07:57.230 回答
0

派对迟到了,但这对我有用

在你的 app.js 中使用它

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

在 ejs 等客户端获取当前用户详细信息

<%= locals.currentUser.[parameter like name || email] %>
于 2020-07-02T11:20:41.033 回答
-3

您需要确保在注册护照中间件之前注册一个填充的中间件。req.session

例如下面使用express cookieSession 中间件

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 ...

});
于 2013-02-19T10:51:21.313 回答