gpt4 book ai didi

javascript - 如何处理 Express Session?

转载 作者:行者123 更新时间:2023-12-02 22:01:18 25 4
gpt4 key购买 nike

我正在尝试处理 Node.js、Express、Passport 应用程序中的身份验证 session 。我编写了几行代码来使用 Express-Session,即使我注册新用户,它仍然无法进行身份验证。

这是策略。

// Local Strategy
passport.use(new LocalStrategy({ usernameField: 'email' }, function(username, password, done){
User.findOne({ 'email': username }, function(err, user){
if(err) throw err;
if(!user){
return done(null, false, {type: "danger", message: 'No user found'});
}

// Match Password
bcrypt.compare(password, user.password, function(err, isMatch){
if(err) throw err;
if(isMatch){
return done(null, user);
} else {
return done(null, false, {type: "danger", message: 'Wrong password'});
}
});
});
}));

这里是序列化器。

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

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

这是登录和注册路线。

// Login page and form
router.get('/login', function(req, res) {
res.render('login');
});
router.post('/login', passport.authenticate('local',
{successRedirect: '/chat',
failureRedirect: '/login'}));

// Register page and form
router.get('/register', function(req, res) {
let errors = [];
res.render('register', { 'errors': '' });
});
router.post('/register', [
check('name').notEmpty().withMessage('Name field is empty'),
check('surname').notEmpty().withMessage('Surname field is empty'),
check('email').notEmpty().withMessage('E-mail is empty'),
check('password').notEmpty().withMessage('Password field is empty'),
check('password_confirm').notEmpty().withMessage('Password confirmation field is empty'),
check("password", "Passwords don't match")
.custom((value,{req}) => {
if (value !== req.body.password_confirm) {
throw new Error("Passwords don't match");
} else {
return value;
}
}),
], function(req, res) {
const { name, surname, email, password } = req.body;

let errors = validationResult(req);

console.log(errors.errors);

if(!errors){
res.render('register', { 'errors': errors.errors });
console.log('ebebe');
} else {
console.log('oooo');
let NewUser = new User ({
name, surname, email, password
});
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash(password, salt, function(err, hash) {
NewUser.password = hash;
NewUser.save();
});
});
res.redirect('/chat');
}
});

这是 protected 路由。

router.get('/chat', (req, res) => {
if(req.isAuthenticated()) {
res.send('definitely secure page');
console.log(req.user);
console.log(req.isAuthenticated());
} else {
res.send('ebebe');
console.log(req.user);
console.log(req.isAuthenticated());
}
});

如何使其正常工作以及我做错了什么?

最佳答案

这是一种方法。您可以将 jsonwebtokenexpress-session 结合使用,并编写一个中间件函数来检查 token 是否有效,并使用它来保护您想要保护的路由。以下是一些代码片段,我希望它们能帮助您找到正确的方向。

首先,您可以在 UserSchema 中编写这样的函数,以便稍后在用户登录时使用它来生成 jwt token

var jwt = require('jsonwebtoken');
UserSchema.methods.generateJWT = function() {
var today = new Date();
var exp = new Date(today);
exp.setDate(today.getDate() + 60);

return jwt.sign({
id: this._id,
username: this.username,
exp: parseInt(exp.getTime() / 1000),
}, secret);
};

然后在登录路由中您可以使用它来生成 token 。

router.post('/login', passport.authenticate('local',
failureRedirect: '/login'}), function(req, res) {
req.user.token = user.generateJWT();

req.session.token = req.user.token;
res.redirect('/dashboard')
});

然后就可以编写中间件了

function auth(req, res, next) {
//console.log(req.session.token)
if (req.session.token) {

const token = req.session.token


let decoded = jwt.verify(token, secret)
console.log(decoded)

User.findById(decoded.id, function(err, user) {
if (err || !user) {
return res.redirect('/')
}
//console.log(user)
res.locals.user = user
req.user = user
next()
})
} else {
return res.redirect('/')
}

}

然后你就可以用它保护你的路由

router.get('/protected', auth, function(req, res) {


})

关于javascript - 如何处理 Express Session?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59865149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com