Files
hv2-all-in-one/ui/hv2-ui/src/app/token.service.ts

105 lines
3.4 KiB
TypeScript

import { Injectable } from '@angular/core';
import { MessageService } from './message.service';
import { HttpClient } from '@angular/common/http';
import { UserCreds } from './userCreds'
import jwt_decode from 'jwt-decode'
import { Observable, interval, Subject, Subscription } from 'rxjs'
import { map, takeWhile } from 'rxjs/operators'
import { authserviceBaseUrl, applicationId } from './config'
interface TokenTuple {
authToken: string
refreshToken: string
}
@Injectable({
providedIn: 'root'
})
export class TokenService {
public static Id_AuthToken_Key : string = "id_authtoken";
public static Id_RefreshToken_Key : string = "id_refreshtoken";
private _expiryTime = new Subject<number>()
private subscription: Subscription
constructor(private http: HttpClient, private messageService: MessageService) {
}
checkAuthenticated(): boolean {
let result: boolean = false
const token = localStorage.getItem(TokenService.Id_AuthToken_Key)
if (token) {
let expiration = jwt_decode(token)["exp"]
if ((expiration * 1000) > Date.now()) {
result = true
} else {
this.logout()
}
}
return result
}
logout() : void {
localStorage.removeItem(TokenService.Id_AuthToken_Key)
localStorage.removeItem(TokenService.Id_RefreshToken_Key)
this.messageService.add("Token removed from local storage")
}
get expiryTime(): Observable<number> {
return this._expiryTime
}
setExpiryTime(token: string) :void {
let exp = jwt_decode(token)["exp"]
let iat = jwt_decode(token)["iat"]
let start = exp - iat
if (this.subscription && !this.subscription.closed) {
this.subscription.unsubscribe()
}
this.subscription = interval(1000).pipe(map(v => start - v)).pipe(takeWhile(v => v != 0)).subscribe(v => this._expiryTime.next(v))
}
async login(login: string, password: string) : Promise<void> {
this.messageService.add(`TokenService: trying to login and obtain token`)
const userCreds : UserCreds = {
"application": applicationId,
"login": login,
"password": password
}
const tokenTuple: TokenTuple = await this.http.post<TokenTuple>(
`${authserviceBaseUrl}/refreshable`,
userCreds
).toPromise()
localStorage.setItem(TokenService.Id_AuthToken_Key, tokenTuple.authToken)
localStorage.setItem(TokenService.Id_RefreshToken_Key, tokenTuple.refreshToken)
this.messageService.add("Token saved")
this.setExpiryTime(tokenTuple.authToken)
}
async refresh() : Promise<void> {
try {
this.messageService.add(`TokenService: trying to refresh tokens`)
const refreshToken = localStorage.getItem(TokenService.Id_RefreshToken_Key)
const tokenTuple: TokenTuple = await this.http.post<TokenTuple>(
`${authserviceBaseUrl}/refresh`,
refreshToken
).toPromise()
localStorage.setItem(TokenService.Id_AuthToken_Key, tokenTuple.authToken)
localStorage.setItem(TokenService.Id_RefreshToken_Key, tokenTuple.refreshToken)
this.messageService.add("Token saved")
this.setExpiryTime(tokenTuple.authToken)
} catch (err) {
this.messageService.add(`error when trying to refresh: ${ JSON.stringify(err, undefined, 4)}`)
localStorage.removeItem(TokenService.Id_AuthToken_Key)
localStorage.removeItem(TokenService.Id_RefreshToken_Key)
this.messageService.add("Token removed from local storage")
}
}
}