ff-admin/src/router/authGuards.ts

83 lines
2.3 KiB
TypeScript
Raw Normal View History

2024-08-23 14:42:32 +02:00
import NProgress from "nprogress";
import { useAuthStore } from "@/stores/auth";
import { useAccountStore } from "@/stores/account";
import { jwtDecode, type JwtPayload } from "jwt-decode";
2024-08-25 10:10:11 +02:00
import { refreshToken } from "../serverCom";
import type { PermissionObject } from "../types/permissionTypes";
import { useAbilityStore } from "../stores/ability";
2024-08-23 14:42:32 +02:00
export type Payload = JwtPayload & {
userId: number;
username: string;
firstname: string;
lastname: string;
mail: string;
permissions: PermissionObject;
};
2024-08-23 14:42:32 +02:00
export async function isAuthenticated(to: any, from: any, next: any) {
const auth = useAuthStore();
NProgress.start();
if (auth.authCheck && localStorage.getItem("access_token") && localStorage.getItem("refresh_token")) {
2024-08-23 14:42:32 +02:00
NProgress.done();
next();
return;
}
await isAuthenticatedPromise()
.then(async (result: Payload) => {
2024-08-23 14:42:32 +02:00
NProgress.done();
next();
})
.catch((err: string) => {
2024-08-23 14:42:32 +02:00
NProgress.done();
next({ name: err ?? "login" });
2024-08-23 14:42:32 +02:00
});
}
export async function isAuthenticatedPromise(): Promise<Payload> {
2024-08-25 10:10:11 +02:00
return new Promise<Payload>(async (resolve, reject) => {
2024-08-23 14:42:32 +02:00
const auth = useAuthStore();
const account = useAccountStore();
const ability = useAbilityStore();
2024-08-25 13:37:23 +02:00
let decoded: Payload | string = "";
try {
decoded = jwtDecode<Payload>(localStorage.getItem("accessToken") ?? "");
} catch (error) {
auth.setFailed();
reject("login");
2024-08-25 13:37:23 +02:00
}
2024-08-23 14:42:32 +02:00
if (typeof decoded == "string" || !decoded) {
auth.setFailed();
reject("login");
2024-08-25 13:37:23 +02:00
} else {
// check jwt expiry
const exp = decoded.exp ?? 0;
const correctedLocalTime = new Date().getTime();
2024-08-25 13:37:23 +02:00
if (exp < Math.floor(correctedLocalTime / 1000)) {
await refreshToken()
.then(() => {
console.log("fetched new token");
})
.catch((err: string) => {
console.log("expired");
auth.setFailed();
reject(err);
2024-08-25 13:37:23 +02:00
});
}
2024-08-25 10:10:11 +02:00
var { firstname, lastname, mail, username, permissions } = decoded;
if (Object.keys(permissions).length === 0) {
auth.setFailed();
reject("nopermissions");
}
auth.setSuccess();
account.setAccountData(firstname, lastname, mail, username);
ability.setAbility(permissions);
2024-08-25 13:37:23 +02:00
resolve(decoded);
2024-08-25 10:10:11 +02:00
}
2024-08-23 14:42:32 +02:00
});
}