我能够通过连接到快速API的服务在Angular 4中创建登录组件。后端 API 返回 JWT 令牌,前端将令牌存储在本地存储中。问题是,令牌在后端过期,但本地存储令牌仍然存在。
在整个前端应用程序中,我检查用户是否已登录,并在登录时显示不同的功能。如果令牌在后端过期,由于令牌仍存在于本地存储中,用户仍然可以尝试完成登录行为,但服务器端不允许发生这种情况。我想做的是定期检查服务器端的令牌以查看它是否已过期,每次我检查是否应该按照此SO答案启用仅登录功能之一
时快速服务器路由在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
})
})
})
这就是我开始感到困惑的地方。我对可观察量的微弱掌握告诉我,我在服务中返回了一个.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
方法,而是只检查一次?
是否有必要实际 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");