@maxlkatze/cms
Version:
A git based Nuxt Module CMS - zero effort, zero cost
89 lines (88 loc) • 2.62 kB
JavaScript
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
};
};