From 93053b0e8ae39e33454697407d0492723fef7d1a Mon Sep 17 00:00:00 2001 From: yangzhe Date: Thu, 10 Jul 2025 09:52:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0jwt-util=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/jwt-util.js | 83 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 utils/jwt-util.js diff --git a/utils/jwt-util.js b/utils/jwt-util.js new file mode 100644 index 0000000..0ed043a --- /dev/null +++ b/utils/jwt-util.js @@ -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; +} \ No newline at end of file