You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

111 lines
2.0 KiB

import jwtDecode from "jwt-decode";
import router from "./routes";
export interface IUser {
id: number,
name: string,
isAdmin: boolean
}
/**
* The active JWT
*/
let token: string | null;
/**
* The decoded user object
*/
let user: IUser | null;
/**
* Check if the user is an admin
*/
export function isAdmin() {
return user && user.isAdmin;
}
/**
* Check if the client is authenticated
*/
export function isAuthenticated() {
return Boolean(token);
}
/**
* Get the logged in user (assumes authentication has been checked)
*/
export function getUser() {
return <IUser>user;
}
/**
* Load the token from local storage
*/
export function loadToken() {
try {
token = localStorage.getItem("jwt");
user = jwtDecode(<string>token);
} catch(e) {
console.log("Failed to load token");
token = null;
user = null;
return false;
}
console.log("Token loaded", token);
return true;
}
/**
* Delete the token from local storage
*/
export function forgetToken() {
token = null;
user = null;
localStorage.removeItem("jwt");
}
/**
* Store a JWT token in local storage
*/
export function storeToken(jwtToken: string) {
try {
user = jwtDecode(jwtToken);
token = jwtToken;
localStorage.setItem("jwt", jwtToken);
} catch(e) {
user = null;
token = null;
return false;
}
return true;
}
/**
* Fetch request providing authentication and logout upon unauthorized requests
*/
export async function authFetch(path: string, options: RequestInit = {}): Promise<Response> {
console.log("Performing auth fetch");
options.credentials = "include";
options.headers = Object.assign(options.headers ?? {}, {
"Authorization": `Bearer ${token}`
});
let response = await fetch(path, options);
if (response.status === 401) {
// forgetToken();
console.log("Forgetting token...");
router.push({ name: "Login" });
throw Error("Unauthorized");
}
return response;
}
/**
* @TODO Remove later
*/
(<any>window).forgetToken = forgetToken;
(<any>window).authFetch = authFetch;
/**
* Ensure the token is loaded upon startup
*/
loadToken();