102 lines
2.5 KiB
TypeScript
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;
|
|
}
|
|
|
|
}
|