| import { Authorization } from '@business/entity/token'; | 
| import { HttpClient } from '@angular/common/http'; | 
| import { environment } from 'environments/environment'; | 
| import { Observable } from 'rxjs/Observable'; | 
| import { Injectable, Inject } from '@angular/core'; | 
| import { UserContext } from '@business/entity/data'; | 
| import { error } from 'selenium-webdriver'; | 
| import { DA_SERVICE_TOKEN, ITokenService, LocalStorageStore } from '@delon/auth'; | 
| import { Subject } from 'rxjs/Subject'; | 
|   | 
| @Injectable() | 
| export class LoginService { | 
|   | 
|   public authorization: Authorization = {token: null}; | 
|   public userContext: UserContext; | 
|   private urls = { | 
|     login: environment.SERVER_BASH_URL + 'auth/login', | 
|     refreshToken: environment.SERVER_BASH_URL + 'auth/token', | 
|     userContext: environment.SERVER_BASH_URL + 'user-context', | 
|   }; | 
|   constructor(private http: HttpClient, | 
|     @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) {  | 
|           // 每2秒检查一次刷新token的时间点 | 
|           setInterval( | 
|              () => { | 
|                  if (this.canRefreshToken() | 
|                      && this.needFreshFromLocal  | 
|                      && this.isReachRefreshTime()) { | 
|                         const _refreshToken =  this._refreshToken;     | 
|                         // 记录刷新时间 | 
|                         this.setRefreshTime(); | 
|                         // 置空needfreshtoken | 
|                         localStorage.setItem('needRefreshToken', 'false');                                             | 
|                         if (!!_refreshToken) { | 
|                             this.http.get(this.urls.refreshToken, {headers: {'X-Refrsh-Token': 'Bearer ' + _refreshToken}} ) | 
|                             .subscribe( | 
|                             res => { | 
|                               if (res['token'] != null) { | 
|                                   this.tokenService.set({'token': res ['token']}); | 
|                                   console.log(new Date() + localStorage._token); | 
|                               } | 
|                             } | 
|                           ); | 
|                       } | 
|                  } | 
|              }, 2000 | 
|           ); | 
|     } | 
|   public validate(username: string, password: string): Observable<Authorization> { | 
|       return this.http.post(this.urls.login, {username: username, password: password, mode: 'Web'}).map( | 
|            (res: any) => { | 
|                this.authorization = res; | 
|                const now = new Date(); | 
|                // expiredTime,refreshToken,refreshTime 与平台的 token 分开储存 | 
|                this.setRefreshTime(); | 
|                localStorage.setItem('expiredTime', String(this.authorization.expiredTime)); | 
|                localStorage.setItem('refreshToken', this.authorization.refreshToken); | 
|                return res; | 
|            } | 
|       ); | 
|   } | 
|   public loadUserContext(): void { | 
|       this.http.get(this.urls.userContext).subscribe( | 
|         (res: UserContext) => { | 
|            this.userContext = res; | 
|            return res; | 
|         } | 
|       ); | 
|   } | 
|   get _refreshToken() { | 
|     return !!this.authorization.refreshToken ? this.authorization.refreshToken : this.refreshTokenFromLocal; | 
|   } | 
|   get refreshTokenFromLocal(): string { | 
|       return localStorage.refreshToken; | 
|   } | 
|   get needFreshFromLocal(): boolean { | 
|      return localStorage.needRefreshToken === 'true'; | 
|   } | 
|   private setRefreshTime() { | 
|     localStorage.setItem('refreshTime', new Date().getTime().toString()); | 
|   } | 
|   private setNeedRefreshToken() { | 
|     localStorage.setItem('needRefreshToken', 'true'); | 
|   } | 
|   private isReachRefreshTime(): boolean { | 
|         const expiredTime = Number(localStorage.expiredTime); | 
|         return !!this.refreshTime && !!expiredTime && this.refreshTime + (expiredTime / 2) * 60000 < new Date().getTime(); | 
|   } | 
|   private get refreshTime(): number  { | 
|     return  Number(localStorage.refreshTime); | 
|   } | 
|   public clearRefreshToken() { | 
|     localStorage.expiredTime = null; | 
|     localStorage.refreshTime = null; | 
|     localStorage.refreshToken = null; | 
|     this.authorization = null; | 
|     localStorage.removeItem('expiredTime'); | 
|     localStorage.removeItem('refreshTime'); | 
|     localStorage.removeItem('refreshToken'); | 
|   } | 
|   private canRefreshToken() { | 
|      return !!localStorage.getItem('expiredTime')  | 
|             && !!localStorage.getItem('refreshTime')  | 
|             && !!localStorage.getItem('refreshToken'); | 
|   } | 
|   public refreshToken () { | 
|     if (this.canRefreshToken()) { | 
|       // 设置需要刷新token | 
|       this.setNeedRefreshToken(); | 
|     } | 
|   } | 
| } |