UNPKG

@maxlkatze/cms

Version:

A git based Nuxt Module CMS - zero effort, zero cost

89 lines (88 loc) 2.62 kB
import { jwtVerify, SignJWT } from "jose"; import { ref } from "vue"; export const useAuthentication = () => { const userState = ref(null); const generateToken = async (payload, secretKey, expiresIn = "24h") => { const expirationTime = getExpirationTime(expiresIn); const encoder = new TextEncoder(); return await new SignJWT(payload).setProtectedHeader({ alg: "HS256" }).setIssuedAt().setExpirationTime(Math.floor(Date.now() / 1e3) + expirationTime).sign(encoder.encode(secretKey)); }; const verifyToken = async (token, secretKey) => { try { const encoder = new TextEncoder(); await jwtVerify(token, encoder.encode(secretKey)); return true; } catch { return false; } }; const decodeToken = (token) => { try { const payloadBase64 = token.split(".")[1]; const payloadJson = atob(payloadBase64); return JSON.parse(payloadJson); } catch { return null; } }; const setToken = (token, expiresInDays = 7) => { if (!token) return; if (import.meta.client) { localStorage.setItem("auth_token", token); } try { if (import.meta.client) { document.cookie = `auth_token=${token}; max-age=${expiresInDays * 24 * 60 * 60}; path=/; ${process.env.NODE_ENV === "production" ? "secure; " : ""}samesite=strict`; } else { } userState.value = decodeToken(token); } catch (error) { console.error("Error setting cookie:", error); } }; const getToken = () => { if (import.meta.server) { return null; } const cookies = document.cookie.split(";"); for (const cookie of cookies) { const [name, value] = cookie.trim().split("="); if (name === "auth_token") return value; } return localStorage.getItem("auth_token"); }; const removeToken = () => { if (import.meta.client) { localStorage.removeItem("auth_token"); document.cookie = "auth_token=; max-age=0; path=/;"; } userState.value = null; }; const getExpirationTime = (timeString) => { const match = timeString.match(/^(\d+)([hdms])$/); if (!match) return 24 * 60 * 60; const value = Number.parseInt(match[1], 10); const unit = match[2]; switch (unit) { case "h": return value * 60 * 60; case "d": return value * 24 * 60 * 60; case "m": return value * 60; case "s": return value; default: return 24 * 60 * 60; } }; return { generateToken, verifyToken, decodeToken, setToken, getToken, removeToken, user: userState }; };