3. 使用 Passport.js 实现认证
Passport.js是一个灵活的Node.js认证中间件,支持多种认证策略(如本地认证、OAuth等)。
安装与配置
首先,安装Passport.js及其本地认证策略:
npm install passport passport-local
然后,配置Passport.js:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
}, async (email, password, done) => {
try {
const user = await User.findOne({ email });
if (!user || !await bcrypt.compare(password, user.password)) {
return done(null, false, { message: 'Invalid email or password' });
}
return done(null, user);
} catch (error) {
return done(error);
}
}));
passport.serializeUser((user, done) => {
done(null, user._id);
});
passport.deserializeUser(async (id, done) => {
try {
const user = await User.findById(id);
done(null, user);
} catch (error) {
done(error);
}
});
app.use(passport.initialize());
app.use(passport.session());
用户注册与登录路由
在用户注册路由中,注册成功后直接登录用户:
app.post('/register', async (req, res, next) => {
try {
const { name, email, password } = req.body;
const user = new User({ name, email, password });
await user.save();
req.login(user, (err) => {
if (err) { return next(err); }
res.status(201).send({ message: 'User registered and logged in' });
});
} catch (error) {
res.status(400).send({ error: 'User registration failed', details: error.message });
}
});
在用户登录路由中,使用Passport.js进行认证:
app.post('/login', passport.authenticate('local'), (req, res) => {
res.send({ message: 'Login successful' });
});
保护路由
使用Passport.js的ensureAuthenticated
中间件来保护路由:
const ensureAuthenticated = (req, res, next) => {
if (req.isAuthenticated()) {
return next();
}
res.status(401).send({ error: 'Access denied' });
};
app.get('/protected', ensureAuthenticated, (req, res) => {
res.send({ message: 'This is a protected route', user: req.user });
});
在本章中,我们介绍了如何在Express应用中实现用户认证与授权,包括用户注册与登录、使用JWT进行身份验证以及使用Passport.js实现认证。通过学习这些内容,你应该能够:
- 实现用户注册与登录功能。
- 使用JWT进行无状态的用户身份验证。
- 使用Passport.js集成多种认证策略。