什么是JWT(Json Web Token)
JWT,全称为 JSON Web Token,是一种开放标准(RFC 7519),用于在网络应用环境间安全地传递信息。JWT 的密钥基于 JSON 格式,因此它易于使用和理解。它主要用于身份验证和信息交换。
JWT 通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。这三部分通过点(.
)分隔开。
-
头部(Header):通常由两部分组成:令牌的类型(JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。
json { "alg": "HS256", "typ": "JWT" }
-
载荷(Payload):包含你想传递的数据。JWT 的载荷部分可以包含任何信息,但通常具有一些注册声明(如
sub
、iss
、exp
等)和自定义声明。json { "sub": "1234567890", "name": "John Doe", "admin": true }
-
签名(Signature):为了防止数据被篡改,JWT 会使用头部中的算法和秘钥对头部和载荷进行签名。
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
JWT的用途
-
身份验证:JWT 最常见的用途是身份验证。一旦用户通过登录验证,他们将获得一个 JWT,之后每次请求都会携带该令牌,从而允许用户访问受保护的路由。
-
信息交换:由于 JWT 可以被签名(例如使用公钥/私钥),因此可以验证信息的发送者以及完整性。这对于传输敏感信息非常有用。
-
跨域认证:在现代的前后端分离的架构中,JWT 允许客户端和服务器之间安全地传递身份信息。
JWT的优势
-
自包含:JWT 令牌中包含了所有用户信息,这意味着不需要在服务器上存储会话信息。
-
跨平台:由于 JWT 是基于 JSON 的,所以它可以在 Web、移动设备等多种平台间无缝使用。
-
加密安全性:JWT 可以通过加密算法进行签名和验证,保证信息的安全性。
实战:如何使用JWT
这里我们用 Node.js 和 Express 构建一个简单的示例,展示如何生成和验证 JWT。
安装依赖
首先,确保你的环境中安装了 Node.js。创建一个新的项目并安装 express
和 jsonwebtoken
。
mkdir jwt-demo
cd jwt-demo
npm init -y
npm install express jsonwebtoken body-parser
创建服务器
接下来,创建一个 server.js
文件,编写以下代码:
const express = require('express');
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');
const app = express();
const PORT = 3000;
const SECRET_KEY = 'your-256-bit-secret';
app.use(bodyParser.json());
// 登录路由
app.post('/login', (req, res) => {
// 假设一个简单的用户验证
const user = { id: 1, username: 'user', password: 'password' }; // 预设用户数据
const { username, password } = req.body;
if (username === user.username && password === user.password) {
// 用户验证成功,生成 JWT
const token = jwt.sign({ id: user.id }, SECRET_KEY, { expiresIn: '1h' });
return res.json({ token });
}
res.status(403).send('用户名或密码错误');
});
// 受保护路由
app.get('/protected', (req, res) => {
const token = req.headers['authorization']?.split(' ')[1];
if (!token) {
return res.sendStatus(401);
}
jwt.verify(token, SECRET_KEY, (err, user) => {
if (err) {
return res.sendStatus(403);
}
res.json({ message: '欢迎访问受保护的路由', user });
});
});
app.listen(PORT, () => {
console.log(`服务器正在运行,地址:http://localhost:${PORT}`);
});
运行服务器
在终端中运行以下命令启动服务器:
node server.js
测试接口
- 登录:使用 Postman 或 curl 进行请求 ``` POST http://localhost:3000/login Content-Type: application/json
{ "username": "user", "password": "password" } ``` 成功后将返回一个 JWT。
- 访问受保护的路由:
GET http://localhost:3000/protected Authorization: Bearer <token>
替换<token>
为你从登录接口获得的 JWT。
总结
JWT 是一种轻量级、跨平台的身份验证和信息交换机制,借助于它,你可以高效地管理用户身份和权限。通过这篇文章,你应该了解了 JWT 的基本概念、用途、优势以及如何在 Node.js 中实现 JWT。希望你能在项目中灵活应用 JWT!