Files
miniplan/public/src/services/auth.ts
T

110 lines
3.0 KiB
TypeScript

import {api} from "@/services/api";
import {Subject} from "rxjs";
export namespace Auth {
let loggedIn = false
let user = ""
let privileges: string[] = []
export const loggedInSubject: Subject<boolean> = new Subject<boolean>()
export function isLoggedIn() {
return loggedIn
}
export function getUser() {
return user;
}
export function getPrivileges() {
return privileges
}
function setToken(token: string) {
window.localStorage.setItem("token", token)
}
export function getToken(): string {
return window.localStorage.getItem("token")
}
export async function login(username: string, password: string): Promise<{
success: boolean,
token?: string
}> {
return api("/auth", "POST", {
username, password
}).then(res => res.json() as Promise<{
success: boolean,
token?: string
privileges?: string[]
}>).then(res => {
if(res.success) {
loggedIn = true
user = username;
privileges = res.privileges ?? []
privileges.push(username)
setToken(res.token ?? "")
loggedInSubject.next(true)
}
return Promise.resolve(res)
})
}
export function logout(){
setToken("")
loggedIn = false;
user = "";
privileges = []
loggedInSubject.next(false)
}
export function checkForToken() {
const token = getToken()
if(token && token != ""){
const payload = parseJwt(token)
loggedIn = true
user = payload.username
privileges = payload.privileges
privileges.push(user)
loggedInSubject.next(true)
}
}
export async function refreshToken(): Promise<boolean> {
const token = getToken()
if (!token) return false
return api("/auth/refresh", "POST").then(res => {
if (res.status == 200) {
return res.json().then(data => {
if (data.success) {
setToken(data.token ?? "")
const payload = parseJwt(data.token)
loggedIn = true
user = payload.username
privileges = payload.privileges
privileges.push(user)
loggedInSubject.next(true)
return true
}
return false
})
}
return false
}).catch(() => false)
}
function parseJwt (token) {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
var jsonPayload = decodeURIComponent(window.atob(base64).split('').map(function(c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload);
}
}