身份验证与安全性
在 Express.js 应用程序中,身份验证与会话管理是确保用户数据安全和访问控制的核心功能。以下是三种常见的身份验证机制:Cookie 与 Session、JWT (JSON Web Token) 以及路由保护的详细介绍。
Cookie 和 Session
Session 通过在服务器端保存会话数据,并在客户端通过 Cookie 存储 Session ID 来实现。客户端的每个请求都会包含这个 ID,服务器根据此 ID 查找并验证会话数据。
安装依赖
npm install express-session cookie-parser
express-session
:用于管理服务器端的会话。cookie-parser
:用于解析请求中的 Cookie。
基本实现
以下是一个使用 Session 实现用户会话管理的例子:
import express from 'express';
import session from 'express-session';
import cookieParser from 'cookie-parser';
const app = express();
// 使用 cookie-parser 解析请求中的 Cookie
app.use(cookieParser());
// 使用 express-session 管理 Session
app.use(
session({
secret: 'your-secret-key', // 用于加密 Session ID 的密钥
resave: false, // 如果 Session 没有修改,是否强制保存
saveUninitialized: true, // 是否保存未初始化的会话
cookie: { secure: false }, // 如果使用 HTTPS,secure 应设为 true
}),
);
// 测试会话存储
app.get('/', (req, res) => {
if (req.session.views) {
req.session.views++; // 增加访问次数
res.send(`You have visited this page ${req.session.views} times`);
} else {
req.session.views = 1; // 初始化访问次数
res.send(
'Welcome to the session demo! Refresh to see the view count increase.',
);
}
});
app.listen(1234, () => {
console.log('Server is running on http://localhost:1234');
});
Cookie 和 Session 机制
- 用户首次访问时,服务器生成一个唯一的 Session ID 并存储在 Cookie 中。
- 后续的每次请求都会带上这个 Cookie,服务器根据 Session ID 找到对应的会话数据。
登入和登出
// 用户登录
app.post('/login', (req, res) => {
const { username } = req.body;
req.session.username = username; // 将用户信息存储在 Session 中
res.send(`Logged in as ${username}`);
});
// 用户登出
app.post('/logout', (req, res) => {
req.session.destroy(err => {
if (err) {
return res.status(500).send('Logout failed');
}
res.send('Logged out successfully');
});
});