expirytime finally working

This commit is contained in:
Wolfgang Hottgenroth 2021-09-06 18:12:45 +02:00
parent 9478ad27c6
commit fd25f1fcf5
Signed by: wn
GPG Key ID: 6C1E5E531E0D5D7F
4 changed files with 31 additions and 7 deletions

View File

@ -1,4 +1,5 @@
// export const serviceBaseUrl = "https://api.hv.nober.de"; // export const serviceBaseUrl = "https://api.hv.nober.de";
// export const serviceBaseUrl = "http://172.16.10.38:5000"; // export const serviceBaseUrl = "http://172.16.10.38:5000";
export const serviceBaseUrl = "http://localhost:8080"; export const serviceBaseUrl = "http://localhost:8080"
export const authserviceBaseUrl = "https://authservice.hottis.de"

View File

@ -29,6 +29,7 @@
<span>Nober Grundbesitz GbR Hausverwaltung</span> <span>Nober Grundbesitz GbR Hausverwaltung</span>
<span class="spacer"></span> <span class="spacer"></span>
<span class="gittagversion">GITTAGVERSION</span> <span class="gittagversion">GITTAGVERSION</span>
<span class="gittagversion" *ngIf="authenticated">Läuft aus in {{expiryTime | async }} Sekunden</span>
<a *ngIf="!authenticated" mat-button routerLink="/login">Login</a> <a *ngIf="!authenticated" mat-button routerLink="/login">Login</a>
<a *ngIf="authenticated" mat-button routerLink="/logout">Logout</a> <a *ngIf="authenticated" mat-button routerLink="/logout">Logout</a>
</mat-toolbar> </mat-toolbar>

View File

@ -33,6 +33,10 @@ export class NavigationComponent {
}) })
} }
get expiryTime(): Observable<number> {
return this.tokenService.expiryTime
}
ngOnInit() { ngOnInit() {
this.authenticated = this.tokenService.checkAuthenticated() this.authenticated = this.tokenService.checkAuthenticated()
} }

View File

@ -3,7 +3,9 @@ import { MessageService } from './message.service';
import { HttpClient, HttpHeaders } from '@angular/common/http'; import { HttpClient, HttpHeaders } from '@angular/common/http';
import { UserCreds } from './userCreds' import { UserCreds } from './userCreds'
import jwt_decode from 'jwt-decode' import jwt_decode from 'jwt-decode'
import { Observable, interval, Subject, Subscription } from 'rxjs'
import { map, takeUntil, takeWhile } from 'rxjs/operators'
import { authserviceBaseUrl } from './config'
interface TokenTuple { interface TokenTuple {
@ -19,6 +21,7 @@ export class TokenService {
public static Id_AuthToken_Key : string = "id_authtoken"; public static Id_AuthToken_Key : string = "id_authtoken";
public static Id_RefreshToken_Key : string = "id_refreshtoken"; public static Id_RefreshToken_Key : string = "id_refreshtoken";
private _expiryTime = new Subject<number>()
constructor(private http: HttpClient, private messageService: MessageService) { constructor(private http: HttpClient, private messageService: MessageService) {
} }
@ -39,13 +42,24 @@ export class TokenService {
return result return result
} }
logout() { logout() : void {
localStorage.removeItem(TokenService.Id_AuthToken_Key) localStorage.removeItem(TokenService.Id_AuthToken_Key)
localStorage.removeItem(TokenService.Id_RefreshToken_Key) localStorage.removeItem(TokenService.Id_RefreshToken_Key)
this.messageService.add("Token removed from local storage") this.messageService.add("Token removed from local storage")
} }
async login(login: string, password: string) { 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
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`) this.messageService.add(`TokenService: trying to login and obtain token`)
const userCreds : UserCreds = { const userCreds : UserCreds = {
"application": "hv2", "application": "hv2",
@ -53,25 +67,29 @@ export class TokenService {
"password": password "password": password
} }
const tokenTuple: TokenTuple = await this.http.post<TokenTuple>( const tokenTuple: TokenTuple = await this.http.post<TokenTuple>(
"https://authservice.hottis.de/refreshable", `${authserviceBaseUrl}/refreshable`,
userCreds userCreds
).toPromise() ).toPromise()
localStorage.setItem(TokenService.Id_AuthToken_Key, tokenTuple.authToken) localStorage.setItem(TokenService.Id_AuthToken_Key, tokenTuple.authToken)
localStorage.setItem(TokenService.Id_RefreshToken_Key, tokenTuple.refreshToken) localStorage.setItem(TokenService.Id_RefreshToken_Key, tokenTuple.refreshToken)
this.messageService.add("Token saved") this.messageService.add("Token saved")
this.setExpiryTime(tokenTuple.authToken)
} }
async refresh() { async refresh() : Promise<void> {
try { try {
this.messageService.add(`TokenService: trying to refresh tokens`) this.messageService.add(`TokenService: trying to refresh tokens`)
const refreshToken = localStorage.getItem(TokenService.Id_RefreshToken_Key) const refreshToken = localStorage.getItem(TokenService.Id_RefreshToken_Key)
const tokenTuple: TokenTuple = await this.http.post<TokenTuple>( const tokenTuple: TokenTuple = await this.http.post<TokenTuple>(
"https://authservice.hottis.de/refresh", `${authserviceBaseUrl}/refresh`,
refreshToken refreshToken
).toPromise() ).toPromise()
localStorage.setItem(TokenService.Id_AuthToken_Key, tokenTuple.authToken) localStorage.setItem(TokenService.Id_AuthToken_Key, tokenTuple.authToken)
localStorage.setItem(TokenService.Id_RefreshToken_Key, tokenTuple.refreshToken) localStorage.setItem(TokenService.Id_RefreshToken_Key, tokenTuple.refreshToken)
this.messageService.add("Token saved") this.messageService.add("Token saved")
this.setExpiryTime(tokenTuple.authToken)
} catch (err) { } catch (err) {
this.messageService.add(`error when trying to refresh: ${ JSON.stringify(err, undefined, 4)}`) this.messageService.add(`error when trying to refresh: ${ JSON.stringify(err, undefined, 4)}`)
localStorage.removeItem(TokenService.Id_AuthToken_Key) localStorage.removeItem(TokenService.Id_AuthToken_Key)