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