我已经这样配置令牌:
jwt.sign(
{
user: pick(user, ['_id', 'username'])
},
secret,
{
expiresIn: '2m'
}
);
但是当我想检查令牌是否已过期时,此代码不起作用
function isAuthenticated() {
const token = localStorage.getItem('token');
const refreshToken = localStorage.getItem('refreshToken');
try {
decode(token);
const { exp } = decode(refreshToken);
if (exp < (new Date().getTime() + 1) / 1000) {
return false;
}
} catch (err) {
return false;
}
return true;
}
问题是这部分:
if (exp < (new Date().getTime() + 1) / 1000) {
return false;
}
new Date()。getTime()+1)/ 1000 = 1531335468.113
exp = 1531334595
因为我不知道JWT使用哪种时间格式...
我该如何解决?
谢谢!
答案 0 :(得分:8)
如果有人想知道,这就是答案
if (Date.now() >= exp * 1000) {
return false;
}
答案 1 :(得分:5)
您应该使用jwt.verify,它将检查令牌是否已过期。 如果来源不受信任,则jwt.decode不应使用,因为它不会检查令牌是否有效。
答案 2 :(得分:1)
verify
本身如果过期则返回错误。如@Gabriel所说的,更安全。
const jwt = require('jsonwebtoken')
router.use(asyncWrap (async (req, res, next) => {
let token = jwtService.getBearerToken(req)
jwt.verify(token, req.app.get('your-secret'), function(err, decoded) {
if (err) throw new Error(err) // Manage different errors here (Expired, untrusted...)
req.auth = decoded // If no error, token info is returned in 'decoded'
});
next()
}))
答案 3 :(得分:1)
以下函数无需任何库即可工作:
function getJWTExpireDate(jwtToken: string) {
if (jwtToken) {
try {
const [, payload] = jwtToken.split('.');
const { exp: expires } = JSON.parse(window.atob(payload));
if (typeof expires === 'number') {
return new Date(expires * 1000);
}
} catch {
// ignore
}
}
return null;
}
不要用它来检查令牌是否有效。一个很好的用例是在前端显示令牌何时过期。
答案 4 :(得分:0)
答案 5 :(得分:0)
这是对react-native的,但是登录将适用于所有类型。
isTokenExpired = async () => {
try {
const LoginTokenValue = await AsyncStorage.getItem('LoginTokenValue');
if (JSON.parse(LoginTokenValue).RememberMe) {
const { exp } = JwtDecode(LoginTokenValue);
if (exp < (new Date().getTime() + 1) / 1000) {
this.handleSetTimeout();
return false;
} else {
//Navigate inside the application
return true;
}
} else {
//Navigate to the login page
}
} catch (err) {
console.log('Spalsh -> isTokenExpired -> err', err);
//Navigate to the login page
return false;
}
}
答案 6 :(得分:0)
您可以使用 jwt verify 方法来检查您的令牌的有效性。 Err 表示令牌已过期,将引发错误,以便您可以删除存储的令牌。
jwt.verify(token, SECRET, (err, decoded) => {
if (err) {
localStorage.clear();
}}
});
答案 7 :(得分:-1)
// Pass in function expiration date to check token
function checkToken(exp) {
if (Date.now() <= exp * 1000) {
console.log(true, 'token is not expired')
} else {
console.log(false, 'token is expired')
}
}