timemanager/frontend/src/app/auth.service.ts

102 lines
2.5 KiB
TypeScript

import { Injectable } from '@angular/core';
import {Router} from "@angular/router";
const API_TOKEN_KEY = "API_TOKEN";
interface JWTInfo {
user: string,
admin: boolean
}
/**
* Decodes a JWT Token and returns its payload. The JWT Token is **not** checked for validity!
* @param token jwt token to be
*/
function decodeJWTToken(token : string) : JWTInfo {
return JSON.parse(atob(token.split(".")[1]));
}
@Injectable({
providedIn: 'root'
})
export class AuthService {
private apiToken: string = "";
constructor(private router: Router) {
this.reloadToken();
}
/**
* Loads the JWT token from the browsers `localStorgae` (persistent storage) and sets the attribute, if
* a token exists.
* @private
*/
private reloadToken(): void {
const apiToken = localStorage.getItem(API_TOKEN_KEY);
if (apiToken != null) {
this.apiToken = apiToken;
}
}
/**
* Clears the JWT token and deletes it from the browsers `localStorage`. This basically means "logout".
* We do not inform the backend since JWTs automatically expire after some time.
*/
public clearAccessToken(): void {
localStorage.removeItem(API_TOKEN_KEY);
this.apiToken = "";
this.router.navigateByUrl("/");
}
/**
* Sets the JWT token (e.g. after successful login) and stores it in the browsers `localStorage`
* @param _token {string} JWT token
*/
public setAccessToken(_token: string) {
this.apiToken = _token;
localStorage.setItem(API_TOKEN_KEY, this.apiToken);
}
/**
* Returns whether the client currently has a JWT token. This token must not be valid at the time, as
* only the backend can validate.
*/
public hasKey(): boolean {
return this.apiToken !== "";
}
/**
* Returns whether the current JWT token contains admin privileges.
* If no JWT token is currently available, return always false.
*/
public isAdmin() : boolean {
if (this.hasKey()) {
return decodeJWTToken(this.apiToken).admin;
} else {
return false;
}
}
/**
* Returns the current username stored in the JWT payload.
* If no JWT token is currently available, return undefined.
*/
public getUsername() : string | undefined {
if (this.hasKey()) {
return decodeJWTToken(this.apiToken).user;
} else {
return undefined;
}
}
/**
* Return the currently stored JWT token. Might be undefined if no JWT token is available.
*/
public getAccessToken() {
return this.apiToken;
}
}