1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| import { jwtVerify } from 'jose';
const STORAGE_KEY = 'jwt_payload'; const TOKEN_KEY = 'jwt_token';
async function parseToken(token, secret = null) { let decoded; if (!token) throw new Error('Token is empty');
if (secret) { const encoder = new TextEncoder(); const { payload } = await jwtVerify(token, encoder.encode(secret)); decoded = payload; } else { const payloadBase64 = token.split('.')[1]; if (!payloadBase64) throw new Error('Invalid token format'); decoded = JSON.parse(atob(payloadBase64.replace(/-/g, '+').replace(/_/g, '/'))); } return decoded; }
async function setToken(token, secret = null) { const decoded = await parseToken(token, secret); localStorage.setItem(TOKEN_KEY, token); localStorage.setItem(STORAGE_KEY, JSON.stringify(decoded)); }
function getToken() { return localStorage.getItem(TOKEN_KEY) || null; }
function clearToken() { localStorage.removeItem(TOKEN_KEY); localStorage.removeItem(STORAGE_KEY); }
function getDecodedToken() { const raw = localStorage.getItem(STORAGE_KEY); return raw ? JSON.parse(raw) : null; }
function getAuthList() { const payload = getDecodedToken(); return payload?.auths ?? []; }
function isUserHasAuth(auth) { return getAuthList().includes(auth); }
function getRoleList() { const payload = getDecodedToken(); return payload?.roles ?.map(role => role.roleName) .filter(name => typeof name === 'string') ?? []; }
function isUserInRole(roleName) { return getRoleList().includes(roleName); }
export { parseToken, setToken, getToken, getDecodedToken, clearToken, getAuthList, isUserHasAuth, getRoleList, isUserInRole };
|