在现代的 Web 应用开发中,身份验证是保障系统安全的重要环节。Token 认证作为一种常见的身份验证机制,因其无状态、可扩展性等优点被广泛应用。而 JSON Web Token(JWT)则是 Token 认证中非常流行的一种实现方式。本文将深入介绍 JWT 的原理,并通过实际的 Node.js 代码演示如何使用 JWT 进行 Token 认证。
JSON Web Token(JWT)是一种用于在网络应用之间安全传输信息的开放标准(RFC 7519)。JWT 由三部分组成,通过点(.)分隔:
JWT 的结构示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Authorization
头)发送给服务器。首先,我们需要创建一个新的 Node.js 项目,并安装 jsonwebtoken
库:
mkdir jwt-example
cd jwt-example
npm init -y
npm install jsonwebtoken express
以下是一个简单的 Node.js 示例,演示如何使用 JWT 进行身份验证:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const port = 3000;
// 模拟用户数据库
const users = [
{ id: 1, username: 'admin', password: 'password' }
];
// 生成 JWT
const generateToken = (user) => {
const payload = {
id: user.id,
username: user.username
};
const secret = 'your_secret_key';
const options = {
expiresIn: '1h'
};
return jwt.sign(payload, secret, options);
};
// 登录接口
app.post('/login', (req, res) => {
const { username, password } = req.body;
const user = users.find(u => u.username === username && u.password === password);
if (user) {
const token = generateToken(user);
res.json({ token });
} else {
res.status(401).json({ message: 'Invalid credentials' });
}
});
// 验证 JWT 的中间件
const authenticateToken = (req, res, next) => {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (token == null) return res.status(401).json({ message: 'No token provided' });
const secret = 'your_secret_key';
jwt.verify(token, secret, (err, user) => {
if (err) return res.status(403).json({ message: 'Invalid token' });
req.user = user;
next();
});
};
// 受保护的接口
app.get('/protected', authenticateToken, (req, res) => {
res.json({ message: 'This is a protected route', user: req.user });
});
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
generateToken
函数接受一个用户对象作为参数,使用 jwt.sign
方法生成一个 JWT。/login
接口接收用户的用户名和密码,验证用户的凭据,如果验证成功,则生成一个 JWT 并返回给客户端。authenticateToken
是一个中间件函数,用于验证请求头中的 JWT。如果 JWT 有效,则将用户信息添加到 req.user
中,并调用 next()
继续处理请求。/protected
接口使用 authenticateToken
中间件进行身份验证,只有通过验证的用户才能访问该接口。步骤 | 描述 |
---|---|
1 | 用户登录,服务器验证凭据并生成 JWT |
2 | 客户端存储 JWT |
3 | 客户端在后续请求中包含 JWT |
4 | 服务器验证 JWT 的签名 |
5 | 如果签名有效,服务器处理请求并返回响应 |
通过使用 JWT 进行 Token 认证,我们可以实现无状态的身份验证,提高系统的可扩展性和安全性。在实际应用中,我们还需要注意 JWT 的过期时间、密钥的安全性等问题。
希望本文能帮助你理解 JWT 的原理和使用方法,让你在 Node.js 项目中轻松实现身份验证。