UNPKG

@parkingboss/api

Version:
73 lines (72 loc) 2.07 kB
import storage from "store/dist/store.modern"; import decodeJwt from "jwt-decode"; const AUTH_KEY = "user/auth"; function loadFromUrl(skipExpiryCheck) { const url = new URL(location.toString()); const source = Array.from(url.searchParams.entries()) .concat(Array.from(new URLSearchParams(url.hash.replace(/^#/, "")).entries())) .reduce((acc, item) => { acc[item[0]] = item[1]; return acc; }, {}); const token = source.access_token || source.token; if (!token) return null; const usr = jwtUser({ token, type: "bearer" }, skipExpiryCheck); if (usr) setUser(usr); return usr; } function loadFromStorage(skipExpiryCheck) { const data = storage.get(AUTH_KEY); return jwtUser(data, skipExpiryCheck); } export function jwtUser(jwt, skipExpiryCheck) { return jwtToUser(parseJwt(jwt, !!skipExpiryCheck)); } export function loadUser(skipExpiryCheck = false) { return loadFromUrl(skipExpiryCheck) || loadFromStorage(skipExpiryCheck); } export function setUser(data) { storage.set(AUTH_KEY, data); } export function unsetUser() { storage.remove(AUTH_KEY); } function parseJwt(data, skipExpiryCheck) { if (data && data.token) { try { const jwt = decodeJwt(data.token); if (jwt && (skipExpiryCheck || notExpired(jwt))) { return Object.assign(data, jwt); } } catch (e) { console.warn("Failed to Decode JWT. Use is not logged in.", e); unsetUser(); } } return null; } function notExpired(jwt) { if (jwt && jwt.exp) { return jwt.exp * 1000 > Date.now(); } return false; } function jwtToUser(jwt) { if (!jwt) return jwt; const expms = jwt.exp * 1000; const iatms = jwt.iat * 1000; const nbfms = jwt.nbf * 1000; return Object.assign(jwt, { user: jwt.sub, expms, expires: new Date(expms), iatms, created: new Date(iatms), nbfms, starts: new Date(nbfms), }); }