获取用户名 Passport js

Get username Passport js

我是初学者,我有一个使用 passport js 的简单节点应用程序。

一切正常,但我想在此处获取用户名

app.get('/', checkLogged, (req, res) => {

   res.render('index', {name: username});

});

完整项目在这里https://github.com/aruzo1/passport

有人可以帮助我吗? 有办法吗?

Ps。这个数据库是临时的

app.js

if (process.env.NODE_ENV !== 'production'){
    require('dotenv').config();
}

const express = require('express'),
      app = express(),
      port = process.env.PORT || 3000,
      bcrypt = require('bcrypt'),
      passport = require('passport'),
      initializePassport = require('./passport-config'),
      flash = require('express-flash'),
      session = require('express-session'),
      methodOverride = require('method-override'),
      users = []

initializePassport(passport,
     email => users.find(user => user.email === email),
     id => users.find(user =>  user.id === id)
);
require('ejs');

app.set('view engine', 'ejs');
app.use(express.urlencoded({extended : false}));
app.use(flash());
app.use(session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(methodOverride('_method'));

app.get('/', checkLogged, (req, res) => {
    res.render('index', {name: ""});
});

app.get('/login', checkNotLogged, (req, res) => {
    res.render('login', {});
});

app.get('/register', checkNotLogged, (req, res) => {
    res.render('register', {});
});

app.post('/register', checkNotLogged, async (req, res) => {
    try{
        hashedPassword = await bcrypt.hash(req.body.password, 10);
        users.push({
            id: Date.now().toString(),
            name: req.body.name,
            email: req.body.email,
            password: hashedPassword
        });
        res.redirect('/login')
    }
    catch{
        res.redirect('/register')
    }
});

app.post('/login', checkNotLogged, passport.authenticate('local', {
    successRedirect: '/',
    failureRedirect: '/login',
    failureFlash: true
}));

app.delete('/logout', (req, res) => {
    req.logOut()
    res.redirect('/login')
});

app.listen(port, () => {
    console.log('serwer wystartowal')
});

function checkLogged(req, res, next){
    if (req.isAuthenticated()){
        return next();
    }
    res.redirect('/login');
}

function checkNotLogged(req, res, next){
    if (req.isAuthenticated()){
        return res.redirect('/')
    }
    next()
}

护照-config.js

const localStrategy = require('passport-local').Strategy,
      bcrypt = require('bcrypt')

function initialize(passport, getUserByEmail, getUserById){
    const authentitaceUser = async (email, password, done) =>{
        const user = getUserByEmail(email);
        if (user == null){
            return done(null, false, {message: 'no user with that email'});
        };

        try{
            if(await bcrypt.compare(password, user.password)){
                return done(null, user)
            }
            else{
                return done(null, false, {message: 'wrong password'})
            }
        } 
        catch(e){
            return done(e)
        }
    };

    passport.use(new localStrategy({
        usernameField: 'email'
    }, authentitaceUser));

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

    passport.deserializeUser((id, done) => {
        return done(null, getUserById(id))
    });
};

module.exports = initialize

res.render('index', {name: req.user.username })

应该可以解决问题,只要身份验证本身成功并且您的用户有一个 'username' 字段。否则,req.user.username 应该抛出错误;

看起来您也在使用持久会话 - 您应该能够从 req.user 获取用户信息并将其包含在您的响应中...

app.get('/', checkLogged, (req, res) => {

   res.send(req.user);

});

在 passport.js 中,当它验证用户已登录时,passport.js 会自动将登录用户信息设置为 res object.So 这意味着每当用户发送请求时已经拥有用户 info.Here 的请求对象是执行此操作的函数:

  passport.setAuthenticatedUser=(req,res,next)=>{
if(req.isAuthenticated())
{
    res.locals.user=req.user;
}
next();

}

因此,在您的情况下,当用户当时登录时,passport 会自动将用户信息设置为每个资源 object.So 当任何请求进入该请求时,已经存在用户信息。

这就是为什么你需要写:

  res.render('index', {name: req.user.username })

而不是写作:

    res.render('index', {name: username});