JWT 令牌在一定时间后不会过期
Posted
技术标签:
【中文标题】JWT 令牌在一定时间后不会过期【英文标题】:JWT Token doesn't expire after a certain time 【发布时间】:2020-03-01 08:00:01 【问题描述】:为什么我的 jwt 令牌在 1 小时后没有过期?
我注意到,当我忘记在我使用 vuex 在 vuejs 中创建的管理面板中注销我的帐户时,它不会过期。
这是我在 ExpressJS 中使用 bcrypt 和 express-jwt 作为令牌创建的 API。
router.post('/login', (req, res) =>
let sql = "SELECT * FROM AUTHENTICATION WHERE email = ?";
myDB.query(sql, [req.body.email, req.body.password], function (err, results)
if (err)
console.log(err);
else
if (!results)
res.status(404).send('No user found.')
else
try
let passwordMatched = bcrypt.compareSync(req.body.password, results[0].password);
if (passwordMatched)
// Passwords match
let token = jwt.sign( id: results.id , config.secret,
expiresIn: '1h'
);
res.status(200).send( auth: true, token: token, user: results );
else
//Password doesn't match
return res.status(401).send( auth: false, token: null );
catch (error)
res.send( Success: false )
)
);
这是我在 vuex 中的登录信息,我从后端收到了令牌。
import axios from 'axios';
const state =
status: '',
token: localStorage.getItem('token') || '',
user:
;
const getters =
isLoggedIn: state => !!state.token,
authStatus: state => state.status,
;
const mutations =
auth_request(state)
state.status = 'loading'
,
auth_success(state, token, user)
state.status = 'success'
state.token = token
state.user = user
,
auth_error(state)
state.status = 'error'
,
logout(state)
state.status = ''
state.token = ''
,
;
const actions =
login( commit , user)
return new Promise((resolve, reject) =>
commit('auth_request')
axios( url: 'http://localhost:9001/login/login', data: user, method: 'POST' )
.then(resp =>
const token = resp.data.token
const user = resp.data.user
localStorage.setItem('token', token)
// Add the following line:
axios.defaults.headers.common['Authorization'] = token
commit('auth_success', token, user)
resolve(resp)
)
.catch(err =>
commit('auth_error')
localStorage.removeItem('token')
reject(err)
)
)
;
编辑:为登录添加了 vuejs 代码
感谢大家的帮助!
【问题讨论】:
你能告诉我们你的 Vue 代码吗?您实际上是在定期验证令牌,还是在登录时只验证一次? JWT 过期与您的身份验证系统没有任何关系,它只是意味着如果您在创建令牌后尝试验证它的时间过长(在这种情况下超过一小时),则不应再将其视为有效。跨度> 【参考方案1】:您的 JWT 令牌只是一个编码 + 签名的 JSON,其中包含 expiresIn
、iat
等相关字段。
虽然它可能包含expiresIn
字段,但这并不意味着后端服务器会接受它。
需要在后端服务器写入逻辑来解析时间戳,与当前时间做比较判断是否已经过期。如果过期了,后端应该返回一个401 Unauthorized
的响应码告诉前端(你的Vue客户端)这个token已经失效了。
您可以做的是将过期检查逻辑放在中间件中,以查看请求标头的授权字段。
【讨论】:
以上是关于JWT 令牌在一定时间后不会过期的主要内容,如果未能解决你的问题,请参考以下文章