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