fengxiang
2018-03-12 43afaa6ad53ca4368fbc6426500f3f71f6f8b765
src/app/business/services/http/login.service.ts
@@ -2,33 +2,93 @@
import { HttpClient } from '@angular/common/http';
import { environment } from 'environments/environment';
import { Observable } from 'rxjs/Observable';
import { Injectable } from '@angular/core';
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;
  public userContext:UserContext;
  public authorization: Authorization = {token: null};
  public userContext: UserContext;
  private urls = {
    login:environment.SERVER_BASH_URL+'/auth/login',
    userContext:environment.SERVER_BASH_URL+'/user-context',
    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) { }
  public validate(username:string,password:string):Observable<Authorization>{
      return this.http.post(this.urls.login,{username:username,password:password,mode:"Web"}).map(
           (res:any) => {
  constructor(private http: HttpClient,
    @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) {
          // 每2秒检查一次刷新token的时间点
          setInterval(
             () => {
                 if (this.needFreshFromLocal && this.isReachRefreshTime()) {
                        // 记录刷新时间
                        this.setRefreshTime();
                        // 置空needfreshtoken
                        localStorage.setItem('needRefreshToken', 'false');
                        const _refreshToken =  this._refreshToken;
                        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', this.authorization.expiredTime.toString());
               localStorage.setItem('refreshToken', this.authorization.refreshToken);
               return res;
           }
      );
  }
  public loadUserContext():void{
  public loadUserContext(): void {
      this.http.get(this.urls.userContext).subscribe(
        (res:UserContext) => {
        (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();
  }
  get refreshTime(): number  {
    return  Number(localStorage.refreshTime);
  }
  public refreshToken () {
           // 设置需要刷新token
           this.setNeedRefreshToken();
  }
}