auth.service.ts
import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { Http, Headers, RequestOptions, URLSearchParams } from '@angular/http'; import { environment } from '../../environments/environment'; import { tokenNotExpired, JwtHelper } from 'angular2-jwt'; import { Subject, Observable } from 'rxjs'; @Injectable() export class AuthService { tokenEndpoint = environment.token_endpoint; requireLoginSubject: Subject; tokenIsBeingRefreshed: Subject ; lastUrl: string; jwtHelper: JwtHelper = new JwtHelper(); constructor(private http: Http, private router: Router) { this.requireLoginSubject = new Subject (); this.tokenIsBeingRefreshed = new Subject (); this.tokenIsBeingRefreshed.next(false); this.lastUrl = "/home"; } isUserAuthenticated() { if(this.loggedIn()) { this.requireLoginSubject.next(false); return true; } else { return false; } } login(username: string, password: string) { let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' }); let options = new RequestOptions({ headers: headers }); let body = new URLSearchParams(); body.set('username', username); body.set('password', password); body.set('client_id', '099153c2625149bc8ecb3e85e03f0022'); body.set('grant_type', 'password'); return this.http.post(this.tokenEndpoint, body, options).map(res => res.json()); } loggedIn() { return tokenNotExpired(); } addTokens(accessToken: string, refreshToken: string) { localStorage.setItem('id_token', accessToken); localStorage.setItem('refresh_token', refreshToken); } getRefreshTokenExpirationDate() { var token = localStorage.getItem('id_token'); if (token) { let tokenExpDate = this.jwtHelper.getTokenExpirationDate(token); let sessionExpDate = new Date(tokenExpDate.getTime() + 4*60000); if (new Date() > sessionExpDate) { this.logout(); } return sessionExpDate; } return null; } hasRefreshToken() { let refToken = localStorage.getItem('refresh_token'); if (refToken == null) { this.logout(); } return refToken != null; } refreshTokenSuccessHandler(data) { if (data.error) { console.log("Removing tokens."); this.logout(); this.requireLoginSubject.next(true); this.tokenIsBeingRefreshed.next(false); this.router.navigateByUrl('/unauthorized'); return false; } else { this.addTokens(data.access_token, data.refresh_token); this.requireLoginSubject.next(false); this.tokenIsBeingRefreshed.next(false); console.log("Refreshed user token"); } } refreshTokenErrorHandler(error) { this.requireLoginSubject.next(true); this.logout(); this.tokenIsBeingRefreshed.next(false); this.router.navigate(['/sessiontimeout']); console.log(error); } refreshToken() { let refToken = localStorage.getItem('refresh_token'); //let refTokenId = this.jwtHelper.decodeToken(refToken).refreshTokenId; let headers = new Headers({ 'Content-Type': 'application/x-www-form-urlencoded' }); let options = new RequestOptions({ headers: headers }); let body = new URLSearchParams(); body.set('client_id', '099153c2625149bc8ecb3e85e03f0022'); body.set('grant_type', 'refresh_token'); body.set('refresh_token', refToken); return this.http.post(this.tokenEndpoint, body, options) .map(res => res.json()); } tokenRequiresRefresh(): boolean { if (!this.loggedIn()) { console.log("Token refresh is required"); } return !this.loggedIn(); } logout() { localStorage.removeItem('id_token'); localStorage.removeItem('refresh_token'); this.requireLoginSubject.next(true); } }
AUTH-http.service.ts
import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import 'rxjs/Rx'; import { Observable } from 'rxjs/Observable'; import { environment } from '../../environments/environment'; import { AuthHttp } from 'angular2-jwt'; import { AuthService } from './auth.service'; @Injectable() export class AuthHttpService { constructor(private authHttp: AuthHttp, private authService: AuthService, private router: Router) { } get(endpoint: string) { if (this.authService.tokenRequiresRefresh()) { this.authService.tokenIsBeingRefreshed.next(true); return this.authService.refreshToken().switchMap( (data) => { this.authService.refreshTokenSuccessHandler(data); if (this.authService.loggedIn()) { this.authService.tokenIsBeingRefreshed.next(false); return this.getInternal(endpoint); } else { this.authService.tokenIsBeingRefreshed.next(false); this.router.navigate(['/sessiontimeout']); return Observable.throw(data); } } ).catch((e) => { this.authService.refreshTokenErrorHandler(e); return Observable.throw(e); }); } else { return this.getInternal(endpoint); } } post(endpoint: string, body: string) : Observable{ if (this.authService.tokenRequiresRefresh()) { this.authService.tokenIsBeingRefreshed.next(true); return this.authService.refreshToken().switchMap( (data) => { this.authService.refreshTokenSuccessHandler(data); if (this.authService.loggedIn()) { this.authService.tokenIsBeingRefreshed.next(false); return this.postInternal(endpoint, body); } else { this.authService.tokenIsBeingRefreshed.next(false); this.router.navigate(['/sessiontimeout']); return Observable.throw(data); } } ).catch((e) => { this.authService.refreshTokenErrorHandler(e); return Observable.throw(e); }); } else { return this.postInternal(endpoint, body); } } private getInternal(endpoint: string) { return this.authHttp.get(endpoint); } private postInternal(endpoint: string, body: string) { return this.authHttp.post(endpoint, body); } }
audience.service.ts
import { Injectable } from '@angular/core'; import 'rxjs/Rx'; import { Observable } from 'rxjs/Observable'; import { environment } from '../../environments/environment'; import { AuthHttpService } from './auth-http.service'; import { AddDeleteAudienceModel } from './AddAudienceModel'; @Injectable() export class AudienceService { baseApiUrl = environment.api_endpoint; constructor(private authHttpService: AuthHttpService) { } getAllAudiences() { return this.authHttpService.get(this.baseApiUrl + 'audience/all').map(res => res.json()); } addAudience(model: AddDeleteAudienceModel) { return this.authHttpService.post(this.baseApiUrl + 'audience', JSON.stringify(model)).map(res => res.json()); } deleteAudience(model: AddDeleteAudienceModel) { return this.authHttpService.post(this.baseApiUrl + 'audience/delete', JSON.stringify(model)).map(res => res.json()); } }