2017-01-03 27 views
2

我想创建一个独立的服务,只负责检查令牌是否过期。angular2 - 设置间隔来检查jwt令牌的有效性

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

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

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

  • 用户登录,在
  • 家组件初始化
  • 订阅会话check.service.validate()
  • 检查会话验证检查

这里的问题的输出是,我应该使用Observable还是刚开始一个简单的间隔?处理组件内的定期调用的最佳和最恰当的概念是什么?

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) 
     }); 
    } 
} 
+0

请看看:angular2-jwt(https://github.com/auth0/angular2-jwt) – MMK

+0

当用户试图打开'/ home'路由时,我已经检查过令牌。但我的意图是在整个生命周期中定期检查令牌。 – Alexus

回答

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)); 
    } 
} 

不过我想知道这是处理令牌到期,并最终触发注销过程的合理方法。

0

此行添加到app.module.ts事业服务singleton这行会创建多个实例的服务。

providers: [ SessionCheckService ] 
+0

道歉不够清楚,并不是服务无法访问......它只是我正在寻找一个实际的概念,我应该如何处理'home.component'中的时间间隔以及应该在服务间隔。 – Alexus