YingXingAI/utils/jwt-util.js

83 lines
2.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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;
}