import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { JwtHelperService } from '@auth0/angular-jwt'; import { CookieService } from 'ngx-cookie-service'; import { API_SETTINGS } from 'src/config'; import shared from '../Shared'; const jwtHelper = new JwtHelperService(); @Injectable({ providedIn: 'root' }) export class AuthService { shared = shared; constructor(private http: HttpClient, private cookie: CookieService) { } login(username: string, password: string) { return this.http.post(`${API_SETTINGS.apiURL}/auth/login`, { username, password }, { responseType: 'text' }); } register(user: any) { return this.http.post(`${API_SETTINGS.apiURL}/auth/register`, { ...user }, { responseType: 'text' }); } getGuestToken(){ return this.http.post(`${API_SETTINGS.apiURL}/auth/guestToken`, {}, { responseType: 'text' }); } isAuthenticated(): boolean { if (this.cookie.check('token')) { var token = this.cookie.get('token'); var property=jwtHelper.decodeToken(this.cookie.get('token')); var username=property['name']; var userId = property['id']; return !jwtHelper.isTokenExpired(token) && username!=""; } return false; } lastToken?: string; refresher: any; enableAutoRefresh() { this.lastToken = this.cookie.get('token'); let exp = jwtHelper.getTokenExpirationDate(this.lastToken); if (!exp) { exp = new Date(); } var property=jwtHelper.decodeToken(this.cookie.get('token')); var username=property['name']; if(username!=""){ this.refresher = setTimeout(() => { console.log('refreshing token!'); this.http.post(`${API_SETTINGS.apiURL}/auth/renewJwt`, {}, { headers: this.authHeader(), responseType: 'text' }).subscribe((response) => { this.authenticate(response); }); }, exp.getTime() - new Date().getTime() - 60000); } else{ this.refresher = setTimeout(() => { console.log('refreshing token!'); this.getGuestToken().subscribe((response) => { this.authenticate(response); }); }, exp.getTime() - new Date().getTime() - 60000); } } addGuestToken(){ this.getGuestToken().subscribe((token)=>{ this.authenticate(token); }); } authenticate(token: string) { let exp = jwtHelper.getTokenExpirationDate(token); if (!exp) { exp = new Date(); } this.cookie.set('token', token, exp); this.updateUser(); } updateUser() { if (this.cookie.check('token')) { const token = this.cookie.get('token'); const decodedToken = jwtHelper.decodeToken(token); console.log("decoded:", decodedToken); this.shared.loggedIn = this.isAuthenticated(); this.shared.username = decodedToken.name; this.shared.userId = decodedToken.id; this.enableAutoRefresh(); } } logOut() { this.cookie.delete('token'); if (this.refresher) clearTimeout(this.refresher); this.shared.loggedIn = false; this.addGuestToken(); } authHeader() { return new HttpHeaders().set("Authorization", "Bearer " + this.cookie.get('token')); } }