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

时间:2017-01-03 11:36:31

标签: angular rxjs observable intervals

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

通常我会启动Interval并使用tokenNotExpired()JwtHelper.isTokenExpired()测试JWT令牌。但是对于Angular2,我不太确定我应该如何处理这种东西。它不是那么容易,对吧? :)

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

下面只是一个假设的例子,说明它是如何起作用的。

  • 用户登录
  • 主页组件初始化
  • 订阅session-check.service.validate()
  • 检查会话验证检查的输出

这里的问题是,我应该使用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 )
        } );
    }
}

3 个答案:

答案 0 :(得分:1)

它转换了来自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 ) );
    }
}

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

答案 1 :(得分:0)

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

providers: [ SessionCheckService ]

答案 2 :(得分:0)

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