随着前端应用的快速发展,大部分 Web 应用和移动应用都需要进行用户身份认证。JWT(JSON Web Token)就是现在最流行的一种身份认证方式之一。本文将介绍如何在 Node.js 中实现JWT身份验证。
JWT 的原理
JWT 是一种 JSON 格式的令牌,用于在客户端和服务端之间传递信息。它由三个部分组成:
- 头部(Header):包含算法类型和令牌类型。
- 负载(Payload):包含用户身份信息等数据。
- 签名(Signature):用于验证令牌的真实性,防止被篡改。
在使用时,服务端在客户端登录验证通过后,颁发一个 JWT 令牌给客户端。客户端将该令牌包含在请求 Header 或 Cookie 中发送到服务端,服务端通过解码和验证令牌来验证用户身份。
实现 JWT 身份验证
安装依赖
安装 jsonwebtoken
模块来生成和验证 JWT 令牌。
npm install --save jsonwebtoken
生成 JWT 令牌
在后台用户登录验证通过后,可以生成一个 JWT 令牌并返回给客户端,让客户端使用该令牌进行后续操作。例如,下面是使用 jsonwebtoken
模块生成 JWT 令牌的代码:
const jwt = require('jsonwebtoken'); const secret = 'your-secret-key'; // 自定义的密钥 const token = jwt.sign({ userId: '123' }, secret, { expiresIn: '1h' });
其中,第一个参数 { userId: '123' }
表示负载中的用户信息(可以自定义其它属性),第二个参数 secret
表示服务端使用的密钥,第三个参数 { expiresIn: '1h' }
表示令牌的有效期为 1 小时。
解码和验证 JWT 令牌
客户端发送带 JWT 令牌的请求到服务端后,需要在服务端对该令牌进行解码和验证,来确定客户端请求的用户身份是否正确。例如,下面是使用 jsonwebtoken
模块解码和验证 JWT 令牌的代码:
const jwt = require('jsonwebtoken'); const secret = 'your-secret-key'; // 自定义的密钥 const verifyToken = (req, res, next) => { const token = req.headers.authorization?.split(' ')[1]; // 从请求 Header 中获取 JWT 令牌 jwt.verify(token, secret, (err, payload) => { if (err) { return res.status(401).json({ message: 'Authentication failed.' }); } req.userId = payload.userId; // 将用户 ID 存储到请求对象中,供后续使用 next(); }); };
其中,verifyToken
是一个 Express 中间件,用于在客户端请求处理前对 JWT 令牌进行解码和验证。在解码和验证后,如果令牌验证失败,则向客户端返回 401 错误,并阻止该请求继续处理。如果令牌验证成功,则将用户 ID 存储到请求对象中,供后续处理使用。
总结
本文介绍了如何在 Node.js 中实现 JWT 身份验证,包括生成和验证 JWT 令牌的代码。在实际开发中,考虑到 JWT 令牌有一定的安全风险,可以采用一些额外的安全手段来加强身份验证的安全性,例如防止 JWT 令牌的被窃取和重复使用等。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b32a63add4f0e0ffc3b85f