aboutsummaryrefslogtreecommitdiff
path: root/frontend/src/app/_services/auth.service.ts
blob: 92cebe7f29ac405170d2b4114835ff8b5ba6d41e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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 shared from '../Shared';
import { Configuration } from '../configuration.service';

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(`${Configuration.settings.apiURL}/auth/login`, { username, password }, { responseType: 'text' });
  }

  register(user: any) {
    return this.http.post(`${Configuration.settings.apiURL}/auth/register`, { ...user }, { responseType: 'text' });
  }

  getGuestToken() {
    return this.http.post(`${Configuration.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(() => {
        this.http.post(`${Configuration.settings.apiURL}/auth/renewJwt`, {}, { headers: this.authHeader(), responseType: 'text' }).subscribe((response) => {
          this.authenticate(response);
        });
      }, exp.getTime() - new Date().getTime() - 60000);
    }
    else {
      this.refresher = setTimeout(() => {
        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);
      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'));
  }
}