前言
关于express专栏的内容,我们之前未涉及一些高级用法/实用中间件,从“提升express技术”和“完善专栏内容的完整度”考虑,近期会补充一些express高级用法/实用中间件的内容。
本篇文章先介绍JWT。
一、JWT简介
1、什么是JWT?
JSON Web Tokens(JWT)是一种开放标准(RFC 7519),用于在网络应用之间安全地传递信息。JWT 是一个紧凑的、独立的 JSON 对象,包含一个头部(Header)、一个载荷(Payload)和一个签名(Signature)。头部通常包含令牌的类型和签名算法;载荷包含声明(Claims),这些声明是关于实体(通常是用户)的声明;签名用于验证 JWT 的完整性和真实性。
2、JWT的优势
无状态和可扩展性:JWT 是无状态的,服务器不需要存储会话信息,这使得 JWT 非常适合分布式系统和微服务架构。
安全性和信任性:JWT 可以通过签名来验证数据的完整性和真实性,确保信息在传输过程中未被篡改。
灵活性和自包含性:JWT 是自包含的,所有必要的信息都包含在令牌中,无需额外查询数据库。
3、JWT的常见用途
身份验证:用户登录后,服务器生成一个 JWT 并返回给客户端。客户端在后续请求中携带这个 JWT,服务器通过验证 JWT 来确认用户身份。
信息交换:JWT 可以安全地在各方之间传递信息,因为 JWT 是签名的,可以防止数据被篡改。
PS:身份验证是最为常用的,包括我在开发公司业务需求,有时候需要找后端拿cookie才能正常访问到测试数据。
二、在express中使用JWT
1、准备工作和安装必要的依赖
专栏的内容,我们基本上是用的express-generator进行创建express项目,这次也不例外。
如果还没安装,则执行语句
npm install -g express-generator
新建文件夹,创建express项目和初始化
express jwt-example
npm install
安装jsonwebtoken和其他必要的依赖
npm install jsonwebtoken express-body-parser
body-parser:一个中间件,用于解析 HTTP 请求体
2、修改app.js
在 app.js 中引入 jsonwebtoken 并配置中间件:
const express = require('express');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const path = require('path');
const app = express();
// Middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// Routes
const indexRouter = require('./routes/index');
const authRouter = require('./routes/auth');
app.use('/', indexRouter);
app.use('/auth', authRouter);
// Error handling
app.use((req, res, next) => {
next(createError(404));
});
app.use((err, req, res, next) => {
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
3、创建routes/auth.js
在 routes 文件夹下创建 auth.js 文件,用于处理登录和生成 JWT:
const express = require('express');
const jwt = require('jsonwebtoken');
const router = express.Router();
//假设这是我们的用户名和密码
const users = [
{ id: 1, username: 'admin', password: 'password' }
];
// 登录路由
router.post('/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (!user) {
return res.status(401).json({ message: 'Invalid credentials' });
}
// 这里假设我们的密钥为 'kainama'
const token = jwt.sign({ userId: user.id, username: user.username }, 'kainama', { expiresIn: '1h' });
res.json({ token });
});
// 验证 JWT 的中间件
const authenticateToken = (req, res, next) => {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) {
return res.status(401).json({ message: 'Access denied' });
}
jwt.verify(token, 'kainama', (err, user) => {
if (err) {
return res.status(403).json({ message: 'Invalid token' });
}
req.user = user;
next();
});
};
// 受保护的路由
router.get('/protected', authenticateToken, (req, res) => {
res.json({ message: 'Access granted', user: req.user });
});
module.exports = router;
4、测试JWT功能
启动项目 npm start

这里使用apipost工具进行测试JWT功能。
新建post请求,如下所示:
点击发送,获得结果

现在我们尝试拿token去访问“受保护”的请求

注意:
参数名为:Authorization
参数值为 Bearer token值(Bearer和token值中间有个空格)
只有正常携带验证,才能正常访问
比如我修改了手动修改了token的值,点击发送就会显示对应的错误信息
三、最佳实践
1、密钥管理
使用环境变量或配置文件来管理 JWT 密钥,避免将密钥硬编码在代码中。
定期更换密钥,以提高安全性。
2、Token过期时间
设置合理的 Token 过期时间,避免 Token 被长期滥用。
提供 Token 刷新机制,允许用户在 Token 过期后重新获取新的 Token。
四、小结
合理使用 JWT,可以实现高效、安全的用户身份验证和信息交换。本文介绍了 JWT 的基本概念、优势以及如何在 Express 应用中使用 JWT 进行身份验证。希望可以让大家更好地理解和使用JWT。
后续我们会更新express的更多高级用法/中间件。
如果你喜欢这篇文章,期待留下你的三连+关注~
2万+

被折叠的 条评论
为什么被折叠?



