【Express】JWT的基本介绍及使用

前言

关于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的更多高级用法/中间件。

如果你喜欢这篇文章,期待留下你的三连+关注~

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十八朵郁金香

感恩前行路上有你相伴

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值