Compare commits
	
		
			2 Commits
		
	
	
		
			44afae176a
			...
			fb2d3d80ce
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | fb2d3d80ce | |
|  | 93053b0e8a | 
|  | @ -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; | ||||||
|  | }  | ||||||
		Loading…
	
		Reference in New Issue