在MEAN应用

时间:2017-07-18 18:39:33

标签: angular jwt mean-stack

我能够通过连接到快速API的服务在Angular 4中创建登录组件。后端API返回JWT令牌,前端将令牌存储在本地存储中。问题是,令牌在后端到期,但本地存储令牌仍然存在。

在整个前端应用程序中,我检查用户是否已登录并显示不同的功能。如果令牌在后端过期,用户仍然可以尝试完成登录行为,因为令牌仍然存在于本地存储中,但服务器端将不允许这种情况发生。我想做的是定期检查服务器端的令牌以查看它是否已过期,每次我检查是否应根据{{3}启用其中一个已登录的功能}

快递服务器路由似乎在Postman中工作正常(localhost:3000 / users / token?token = veryLongTokenString):

// check for expired token
router.get('/token',function(req,res,next){
  "use strict";
  jwt.verify(req.query.token, 'secret', function(err){

    if (err) {
      return res.status(403).json({
        title: 'There is no valid token',
        status: res.statusCode,
        error: err
      })
    }
    res.status(200).json({
      message: 'Token is valid',
      token: token,
      userId: user._id
    })
  })
})

这是我开始感到困惑的地方。我对observables的细致把握告诉我,我在服务中返回.map(auth.service.ts):

isLoggedIn() {
    const token = localStorage.getItem('token')
      ? '?token=' + localStorage.getItem('token')
      : '';

    return this.http.get('/users/token' + token)
      .map( response => response.json())
  }

通过.subscribe

收听我的组件
  isLoggedIn() {
    return this.authService.isLoggedIn()
      .subscribe(x => {
        console.log(x)
        // if status is 200 then return true
        // if not then remove token from local storage?
      })
  }

此时它将返回403错误,但它会反复执行,每分钟堆叠数千个403错误。我猜我不应该使用.map/.subscribe方法,而是只检查一次?

1 个答案:

答案 0 :(得分:0)

是否有必要实际ping服务器到期?到期日期是令牌的一部分,只需在本地评估时间。

 import * as jwt_decode from 'jwt-decode';

 interface TokenDto {
   foo: string;
   exp: number;
   iat: number;
 }

 const sessionIdInfo: TokenDto = jwt_decode(localStorage.getItem('token'));
 const currentDate = moment();
 const current_ts: number = Math.floor(currentDate.valueOf() / 1000);
 if(current_ts > sessionIdInfo.exp)
  console.log("Token expired");