Spaces:
Sleeping
Sleeping
import {Injectable} from '@angular/core'; | |
import {HttpClient, HttpHeaders} from "@angular/common/http"; | |
import {BehaviorSubject, catchError, Observable, shareReplay, tap, throwError} from "rxjs"; | |
import {environment} from "../../../environments/environment"; | |
({ | |
providedIn: 'root' | |
}) | |
export class AuthenticationService { | |
private readonly apiUrl = environment.apiUrl; | |
private token: string | null = this.getTokenFromLocalStorage(); | |
public $authStatus = new BehaviorSubject<string>( | |
this.token !== null ? 'authenticated' : '' | |
); | |
constructor( | |
private http: HttpClient | |
) { | |
} | |
private getTokenFromLocalStorage(): string | null { | |
try { | |
return localStorage.getItem('auth_token'); | |
} catch (e) { | |
return null; | |
} | |
} | |
public getAuthHeaders(): HttpHeaders { | |
return new HttpHeaders({ | |
'Content-Type': 'application/json', | |
Authorization: `Bearer ${this.token}`, | |
}); | |
} | |
public login(password: string): Observable<{ access_token: string; token_type: string }> { | |
// Create the request payload | |
const payload = new URLSearchParams(); | |
payload.set('username', 'admin'); // Username is not used in this case | |
payload.set('password', password); | |
let headers = new HttpHeaders({ | |
'Content-Type': 'application/x-www-form-urlencoded', | |
}); | |
// Send POST request to the backend | |
return this.http.post<{ access_token: string; token_type: string }> | |
(this.apiUrl + '/token', payload.toString(), { headers }).pipe( | |
tap(response => { | |
this.token = response.access_token; | |
localStorage.setItem('auth_token', this.token); | |
this.$authStatus.next('authenticated'); | |
}), | |
shareReplay(1), | |
catchError(error => { | |
if (error.status === 401) { | |
this.$authStatus.next('wrong password'); | |
} else { | |
this.$authStatus.next('server error'); | |
} | |
// Return an observable to continue the stream | |
return throwError(() => error); | |
}) | |
); | |
} | |
public logout(): void { | |
this.token = null; | |
localStorage.removeItem('auth_token'); | |
this.$authStatus.next(''); | |
} | |
} | |