feat: 增加jwt-util工具库

This commit is contained in:
yangzhe 2025-07-10 09:52:24 +08:00
parent d5a7e3d1c8
commit 93053b0e8a
1 changed files with 83 additions and 0 deletions

83
utils/jwt-util.js Normal file
View File

@ -0,0 +1,83 @@
/**
* JWT解析工具
*/
/**
* 解析JWT令牌
* @param {string} token JWT令牌
* @returns {Object} 解析后的用户信息
*/
export function parseJWT(token) {
try {
// 将JWT分割为三部分
const parts = token.split('.');
if (parts.length !== 3) {
throw new Error('无效的JWT格式');
}
// 解码载荷部分(第二部分)
const payload = parts[1];
const decodedPayload = decodeBase64URL(payload);
const payloadObj = JSON.parse(decodedPayload);
// 如果存在UserInfo字段解析它
if (payloadObj.UserInfo) {
try {
payloadObj.UserInfo = JSON.parse(payloadObj.UserInfo);
} catch (e) {
console.error('解析UserInfo失败:', e);
}
}
return payloadObj;
} catch (error) {
console.error('JWT解析失败:', error);
return null;
}
}
/**
* 解码Base64URL编码的字符串
* @param {string} base64Url Base64URL编码的字符串
* @returns {string} 解码后的字符串
*/
function decodeBase64URL(base64Url) {
// 将Base64URL转换为标准Base64
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
// 添加填充字符
const padding = '='.repeat((4 - base64.length % 4) % 4);
const base64Padded = base64 + padding;
// 解码Base64
try {
// 浏览器环境
return decodeURIComponent(
atob(base64Padded)
.split('')
.map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))
.join('')
);
} catch (e) {
// Node.js环境或其他环境
try {
return Buffer.from(base64Padded, 'base64').toString('utf-8');
} catch (e2) {
console.error('Base64解码失败:', e2);
return '';
}
}
}
/**
* 从JWT中获取用户信息
* @param {string} token JWT令牌
* @returns {Object} 用户信息对象
*/
export function getUserInfoFromJWT(token) {
const parsedToken = parseJWT(token);
if (!parsedToken || !parsedToken.UserInfo) {
return null;
}
return parsedToken.UserInfo;
}