我们做go最后项目 这次 改为 nodejs 重写后端
原文章:2.4.4goweb项目完结-CSDN博客文章浏览阅读647次,点赞15次,收藏7次。用户登录认证- 图书信息管理(浏览、新增)- HTML5 :使用语义化标签构建页面结构-https://chxii.blog.csdn.net/article/details/147311462?spm=1011.2415.3001.5331
nodejs重写 项目地址:
JWT 由三部分组成,用点(.
)分隔:
header.payload.signature
Header(头部):
包含令牌类型(通常是 JWT
)和使用的签名算法(如 HS256
、RS256
)。
Payload(负载):
包含声明(Claims),即关于实体(通常是用户)和其他数据的声明。
iss
(发行人)、sub
(主题)、exp
(过期时间)等。Signature(签名):
用于验证消息未被篡改,并且在使用私钥签名的情况下,还可以验证 JWT 的发送者身份。
用户登录:
用户提供凭据(如用户名和密码)。
服务器验证:
服务器验证凭据,如果有效则创建 JWT。
返回令牌:
服务器将 JWT 返回给客户端。
客户端存储:
客户端(通常是浏览器)存储 JWT(如 localStorage、cookie 或内存)。
后续请求:
客户端在每个请求中包含 JWT(通常在 Authorization
头中,格式为 Bearer
)。
服务器验证:
服务器验证 JWT 的签名和有效性,然后处理请求。
安装 jsonwebtoken
包:
npm install jsonwebtoken
const jwt = require('jsonwebtoken');
// 密钥(实际应用中应保存在环境变量中)
const secretKey = 'your-secret-key';
// 载荷数据
const payload = {
userId: 123,
username: 'john_doe',
role: 'admin'
};
const options = {
expiresIn: '1h' // 过期时间,也可以写成数字如 3600(单位是秒)
};
const token = jwt.sign(payload, secretKey, options);
console.log('Generated Token:', token);
原生base64解码
// 典型的 JWT 示例
const jwtToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMywidXNlcm5hbWUiOiJqb2huX2RvZSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTYxMjM0NTY3OCwiZXhwIjoxNjEyMzQ5Mjc4fQ.abcdef1234567890';
// 解析头部
const [encodedHeader, encodedPayload, signature] = jwtToken.split('.');
const header = JSON.parse(Buffer.from(encodedHeader, 'base64').toString());
const payload = JSON.parse(Buffer.from(encodedPayload, 'base64').toString());
console.log('Header:', header);
console.log('Payload:', payload);
console.log('Signature:', signature);
使用jwt库jsonwebtoken:
const parts = jwt.decode(token, { complete: true });
console.log('Header:', parts.header);
console.log('Payload:', parts.payload);
const jwt = require('jsonwebtoken');
const secretKey = 'your-secret-key';
// 客户端发送的令牌
const token = '...';
// 验证令牌
jwt.verify(token, secretKey, (err, decoded) => {
if (err) {
console.error('无效的令牌:', err.message);
return;
}
console.log('解码后的载荷:', decoded);
});
nbf
声明)。const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
// 密钥
const secretKey = 'your-secret-key';
// 验证中间件
const authenticateToken = (req, res, next) => {
// 从头部获取令牌
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) {
return res.status(401).send('未提供令牌');
}
// 验证令牌
jwt.verify(token, secretKey, (err, user) => {
if (err) {
return res.status(403).send('无效的令牌');
}
// 将用户信息添加到请求对象
req.user = user;
next();
});
};
// 受保护的路由
app.get('/protected', authenticateToken, (req, res) => {
res.json({ message: '受保护的资源', user: req.user });
});
app.listen(3000);
// 刷新访问令牌的路由
app.post('/token', (req, res) => {
const refreshToken = req.body.token;
if (!refreshToken) {
return res.status(401).send('未提供刷新令牌');
}
jwt.verify(refreshToken, refreshSecret, (err, user) => {
if (err) {
return res.status(403).send('无效的刷新令牌');
}
// 生成新的访问令牌
const accessToken = jwt.sign({ userId: user.userId }, accessSecret, { expiresIn: '15m' });
res.json({ accessToken });
});
});
密钥管理:
令牌过期:
防止篡改:
重放攻击:
对刷新令牌实现失效机制。
考虑添加 JTI(JWT ID)声明并维护令牌黑名单。
更改go最后项目 为nodejs 后端(项目地址 :GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。https://gitcode.com/chxii/NodeJS_01)