JWT(JSON Web Token)是一种在网络应用间传递信息的标准方法,它使用JSON对象作为发出方和接收方之间的交换格式,用于验证和授权。JWT由三部分组成:Header、Payload和Signature。
Header:包含了JWT的类型、加密算法等信息。
Payload:包含了存放在JWT中传输的信息,也叫做声明(claim)。声明分为三种类型:注册声明(registered claims)、公共声明(public claims)和私人声明(private claims)。
Signature:用于验证消息的完整性并防止篡改。Signature由Header中指定的加密算法和密钥生成。
JWT的工作流程大致如下:
1.用户通过用户名和密码进行身份验证
2.服务器验证用户身份成功后,生成一个JWT并将其发送给用户
3.用户之后的每个请求都将在JWT中携带身份信息
4.服务器检查JWT的签名并验证用户是否有权访问请求的资源
JWT的优点:
1、JWT 是基于标准的JSON格式,易于生成和解析。
2、JWT 包括了签名信息,可以验证消息的完整性并防止篡改。
3、JWT 可以轻松传输在多种环境,例如移动设备、浏览器和服务器,因为它们只需要通过HTTP传输。
4、 JWT是无状态的,即保存在客户端,适合分布式项目开发。
5、JWT可以有效防止CSRF攻击。因为JWT需要服务器签名,黑客无法伪造,JWT中包含终端用户的信息,所以对数据的访问可以追踪。
以下是一个简单的使用 JWT 实现身份验证的示例代码:
npm install express jsonwebtoken body-parser
const express = require('express');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
// 设置密钥
const SECRET_KEY = 'my_secret_key';
// 登录路由
app.post('/login', (req, res) => {
const { username, password } = req.body;
// 模拟用户验证
if (username === 'admin' && password === 'admin') {
// 生成 JWT
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
res.json({ success: true, token });
} else {
res.json({ success: false, message: 'Invalid username or password' });
}
});
// 需要身份验证的路由
app.get('/protected', (req, res) => {
const token = req.headers.authorization;
if (!token) {
// 返回未授权错误
return res.status(401).json({ success: false, message: 'Unauthorized' });
}
// 验证 JWT
jwt.verify(token, SECRET_KEY, (err, decoded) => {
if (err) {
return res.status(401).json({ success: false, message: 'Invalid token' });
}
// 在这里进行身份验证后,可以放行请求
res.json({ success: true, message: 'Welcome, ' + decoded.username });
});
});
// 启动应用
app.listen(3000, () => console.log('App listening on port 3000'));
在上面的代码中,我们首先创建了一个 Express 应用,并使用 bodyParser 中间件解析请求体。
然后,我们定义了一个 POST /login 路由,在这个路由中,我们模拟了用户验证过程,并使用 jsonwebtoken 库生成了一个 JWT,并返回到客户端。
最后,我们定义了一个 GET /protected 路由,该路由需要进行身份验证。在这个路由中,我们首先获取请求头中的 Authorization 字段,然后使用 jsonwebtoken 库验证 JWT。如果 JWT 验证通过,则进行身份认证,并返回请求成功的响应;否则返回未授权的响应。
在实际应用中,我们可以将上述代码根据具体需求进行调整和拓展,以实现更灵活的身份验证机制。