angular2 - 设置检查 jwt 令牌有效性的时间间隔

angular2 - set interval to check jwt token validity

我正在尝试创建一个独立的服务,它只负责检查令牌是否过期。

通常我会开始一个间隔并使用 tokenNotExpired()JwtHelper.isTokenExpired() 测试 JWT 令牌。但是对于 Angular2,我不太确定我应该如何处理这类事情。没那么容易吧? :)

所有令牌有效性目前都在 home.component 中执行,但这正是我试图避免的,因此打算将此问题分离到一个独立的服务中。

下面只是一个假设的例子,说明它可能是如何工作的。

这里的问题是,我应该使用 Observable 还是只启动一个简单的 Interval?在组件内部处理定期调用的最佳和最恰当的概念是什么?

home.component.ts

import { Component, OnInit } from '@angular/core';
import { Http } from '@angular/http';
import { Router } from '@angular/router';
import { SessionCheckService } from '../services/session-check.service';


@Component({
  moduleId: module.id,
  selector: 'home',
  templateUrl: '../templates/home.component.html',
  styleUrls: [ '../styles/home.component.css' ],
  providers: [ SessionCheckService ]
})
export class HomeComponent implements OnInit {
  private jwt: string;
  private decodedJwt: string;

  constructor (
    private router: Router, 
    private http: Http
    private sessionCheckService: SessionCheckService
   // private jwtHelper: JwtHelper
  ) {}

  ngOnInit(): void {
    this.jwt = localStorage.getItem('id_token');
    // this.decodedJwt = null; //this.jwt && this.jwtHelper.decodeToken(this.jwt);
    var s = this.sessionCheckService.validate( this.jwt );
    s.subscribe((res) => {
        console.log( res )
    })
  }

  public logout() {
    localStorage.removeItem('id_token');
    this.router.navigate(['login']);
  }
}

会话-check.service.ts

import { JwtHelper } from 'angular2-jwt';
import { Injectable } from '@angular/core';
//import { AuthHttp, JwtHelper } from 'angular2-jwt';

import { Observable } from 'rxjs';
import 'rxjs/add/operator/toPromise';

@Injectable()
export class SessionCheckService {
    constructor( private jwtH:  JwtHelper ){};

    validate( token:string ): Observable< boolean >{
        return new Observable.interval(500).flatMap( () => {
            this.jwtH.isTokenExpired( token )
        } );
    }
}

将此行添加到 app.module.ts 因为服务是 singleton 并且此行将创建多个服务实例。

providers: [ SessionCheckService ]

原来 this.jwtHelper.isTokenExpired( token ) 的返回值未正确映射。请参阅下面的解决方案。

会话-check.service.ts

@Injectable()
export class SessionCheckService {
    constructor( private jwtHelper: JwtHelper ){};

    public validate( token:string ): Observable< any > {
        return Observable.interval(1000).map( (x) => this.jwtHelper.isTokenExpired( token ) );
    }
}

我仍然想知道这是否是处理令牌过期并最终触发注销程序的合理方法。

您需要为您的请求创建帮助服务headers或拦截器。所以在你设置 headers 之前,你检查令牌是否仍然有效。如果不是,则刷新或重定向用户以登录。这样,在每次请求时,都会自动检查令牌是否仍然有效