Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.66 KB | None | 0 0
  1.  
  2. import { Injectable, ErrorHandler } from '@angular/core';
  3. import {
  4. Http,
  5. Request,
  6. RequestOptions,
  7. RequestOptionsArgs,
  8. RequestMethod,
  9. Response
  10. } from '@angular/http';
  11.  
  12. import { INHttpConfig, NHttpConfig } from './n-http.config';
  13. import { NEndpoints } from './n-endpoints';
  14.  
  15. import { Observable } from 'rxjs/Rx';
  16. import 'rxjs/add/operator/catch';
  17. import 'rxjs/add/observable/throw';
  18. import 'rxjs/add/observable/fromPromise';
  19. import 'rxjs/add/operator/mergeMap';
  20. import {NHttpUtils} from './n-http-utils';
  21. import {NJwtHelper} from './n-jwt-helper';
  22.  
  23. export function tokenNotExpired(tokenName: string, jwt?: string): boolean {
  24.  
  25. const token: string = jwt || localStorage.getItem(tokenName);
  26.  
  27. const jwtHelper = new NJwtHelper();
  28.  
  29. return token != null && !jwtHelper.isTokenExpired(token);
  30. }
  31.  
  32. @Injectable()
  33. export class NHttpJWT {
  34.  
  35. private config: INHttpConfig;
  36.  
  37. constructor(
  38. options: NHttpConfig, private endpoints: NEndpoints, private http: Http, private httpUtils: NHttpUtils,
  39. private errorHandler: ErrorHandler, private defOpts?: RequestOptions
  40. ) {
  41. this.config = options.getConfig();
  42. }
  43.  
  44. public request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
  45. if (typeof url === 'string') {
  46. return this.get(url, options); // Recursion: transform url from String to Request
  47. }
  48. // else if ( ! url instanceof Request ) {
  49. // throw new Error('First argument must be a url string or Request instance.');
  50. // }
  51.  
  52. let req: Request = url as Request;
  53.  
  54. return this.requestWithToken(req);
  55. }
  56.  
  57. public get(url: string, options?: RequestOptionsArgs): Observable<Response> {
  58. return this.requestHelper({ body: '', method: RequestMethod.Get, url }, options);
  59. }
  60.  
  61. public post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> {
  62. return this.requestHelper({ body, method: RequestMethod.Post, url }, options);
  63. }
  64.  
  65. public put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> {
  66. return this.requestHelper({ body, method: RequestMethod.Put, url }, options);
  67. }
  68.  
  69. public delete(url: string, options?: RequestOptionsArgs): Observable<Response> {
  70. return this.requestHelper({ body: '', method: RequestMethod.Delete, url }, options);
  71. }
  72.  
  73. public patch(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> {
  74. return this.requestHelper({ body, method: RequestMethod.Patch, url }, options);
  75. }
  76.  
  77. public head(url: string, options?: RequestOptionsArgs): Observable<Response> {
  78. return this.requestHelper({ body: '', method: RequestMethod.Head, url }, options);
  79. }
  80.  
  81. public options(url: string, options?: RequestOptionsArgs): Observable<Response> {
  82. return this.requestHelper({ body: '', method: RequestMethod.Options, url }, options);
  83. }
  84.  
  85. public storeToken(accessToken: string, refreshToken?: string): void {
  86. localStorage.setItem(this.config.jwtTokenName, accessToken);
  87. if(refreshToken) {
  88. localStorage.setItem(this.config.jwtRefreshTokenName, refreshToken);
  89. }
  90. }
  91.  
  92. public refreshToken(token: string): Observable<Response> {
  93.  
  94. const url = this.endpoints.makeUrl([this.config.jwtRefreshTokenUrl]);
  95. const req = new Request({url, method: RequestMethod.Get});
  96.  
  97. req.headers.set(this.config.jwtHeaderName, [this.config.jwtHeaderPrefix, token].join(' '));
  98. return this.http.request(req);
  99. }
  100.  
  101. private requestHelper(requestArgs: RequestOptionsArgs, additionalOptions?: RequestOptionsArgs): Observable<Response> {
  102. let options = new RequestOptions(requestArgs);
  103. if (additionalOptions) {
  104. options = options.merge(additionalOptions);
  105. }
  106.  
  107. return this.request(new Request(this.httpUtils.mergeOptions(options, this.config, this.defOpts)));
  108. }
  109.  
  110. private requestWithToken(req: Request): Observable<Response> {
  111.  
  112. let authToken: string = localStorage.getItem(this.config.jwtTokenName);
  113. let refreshToken: string;
  114.  
  115. if(!tokenNotExpired(this.config.jwtTokenName, authToken)) {
  116. refreshToken = localStorage.getItem(this.config.jwtRefreshTokenName);
  117.  
  118. if(refreshToken) {
  119.  
  120. return this.refreshToken(refreshToken).map(
  121. (res) => {
  122. const resData = res.json();
  123. this.storeToken(resData.accessToken, resData.refreshToken);
  124. req.headers.set(this.config.jwtHeaderName, [this.config.jwtHeaderPrefix, resData.accessToken].join(' '));
  125. },
  126. (err) => {
  127. return new Observable<Response>((obs: any) => {
  128. obs.error(new Error(err));
  129. });
  130. }
  131. ).flatMap(() => this.http.request(req)).catch(tokenRequestError);
  132.  
  133. } else {
  134. return new Observable<Response>((obs: any) => {
  135. obs.error(new Error('No JWT present'));
  136. });
  137. }
  138. }
  139.  
  140. req.headers.set(this.config.jwtHeaderName, [this.config.jwtHeaderPrefix, authToken].join(' '));
  141. return this.http.request(req).catch(tokenRequestError);;
  142.  
  143. function tokenRequestError(error: Response) {
  144. // Forward 500+ errors to error handler
  145. if (error.status >= 500) {
  146. this.errorHandler.handleError(error.toString());
  147. }
  148. return Observable.throw(error);
  149. }
  150. }
  151.  
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement