引入身份验证与授权
在现代 Web 应用程序中,身份验证和授权是确保用户安全的重要组成部分。身份验证用于确认用户的身份,而授权则决定了用户可以访问哪些资源或执行哪些操作。在本章中,我们将探讨如何使用 Node.js 实现这些功能。
使用 Passport.js 进行身份验证
Passport.js 是一个非常流行的 Node.js 身份验证中间件,支持多种认证策略。通过 Passport.js,你可以轻松实现本地登录、OAuth 登录等。
安装 Passport.js
首先,你需要安装 Passport.js 和相应的策略库。例如,如果你希望使用本地策略进行用户身份验证,你需要安装 passport 和 passport-local:
npm install passport passport-local
配置 Passport.js
接下来,你需要配置 Passport.js 并设置本地策略:
// www.javascriptcn.com code example
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
// 用户模型示例
const User = require('./models/user');
// 配置本地策略
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); }
if (!user.verifyPassword(password)) { return done(null, false); }
return done(null, user);
});
}
));
// 序列化用户
passport.serializeUser(function(user, done) {
done(null, user.id);
});
// 反序列化用户
passport.deserializeUser(function(id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});使用 Passport.js 处理登录请求
在 Express 中,你可以使用 Passport.js 来处理登录请求。这里是一个简单的例子:
app.post('/login',
passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true
})
);注册用户
除了登录,你还需要一个注册功能来允许新用户创建账户。这通常涉及向数据库添加新的用户记录,并确保密码被正确地哈希存储。
// www.javascriptcn.com code example
app.post('/register', function(req, res) {
const newUser = new User({
username: req.body.username,
password: req.body.password // 密码应该在前端进行哈希处理
});
newUser.save(function(err) {
if (err) {
console.log(err);
return res.redirect('/register');
}
res.redirect('/login');
});
});使用 JWT 实现无状态授权
JSON Web Tokens (JWT) 提供了一种无状态的方式来管理用户会话。这意味着服务器不需要存储会话信息,从而减轻了服务器的负担。
安装 JWT 相关库
首先,你需要安装 jsonwebtoken 库:
npm install jsonwebtoken
创建 JWT Token
当用户成功登录后,你可以生成一个 JWT token 并返回给客户端:
// www.javascriptcn.com code example
const jwt = require('jsonwebtoken');
function createToken(user) {
return jwt.sign({ id: user._id }, 'your_jwt_secret', { expiresIn: '24h' });
}
app.post('/login', function(req, res) {
passport.authenticate('local', function(err, user, info) {
if (err || !user) {
res.status(400).json(info);
} else {
const token = createToken(user);
res.json({ token });
}
})(req, res);
});解析 JWT Token
客户端每次请求时都会带上这个 token,服务器需要验证这个 token 的有效性:
// www.javascriptcn.com code example
function verifyToken(req, res, next) {
const token = req.headers['authorization'];
if (!token) {
return res.status(403).send({ auth: false, message: 'No token provided.' });
}
jwt.verify(token, 'your_jwt_secret', function(err, decoded) {
if (err) {
return res.status(500).send({ auth: false, message: 'Failed to authenticate token.' });
}
req.userId = decoded.id;
next();
});
}
// 保护路由
app.get('/protected', verifyToken, function(req, res) {
res.send('This is a protected route!');
});总结
通过本章的学习,你应该对如何在 Node.js 应用程序中实现身份验证和授权有了更深的理解。使用 Passport.js 可以方便地实现多种认证方式,而 JWT 则可以帮助你构建无状态的授权系统。结合实际项目需求,你可以灵活选择适合自己的解决方案。