fengxiang
2018-03-19 b7aa850069d53ca1cc2aea791e7401216f5b795c
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
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.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', 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();
  }
  get refreshTime(): number  {
    return  Number(localStorage.refreshTime);
  }
  public refreshToken () {
           // 设置需要刷新token
           this.setNeedRefreshToken();
  }
}