我能够通过连接到快速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
方法,而是只检查一次?
答案 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");