为什么我的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代码
感谢帮助人员!
答案 0 :(得分:0)
您的JWT令牌只是带有相关字段(例如expiresIn
,iat
)的经过编码+签名的JSON。
尽管它可能包含expiresIn
字段,但这并不意味着后端服务器会尊重它。
需要在后端服务器中编写逻辑以解析时间戳,并与当前时间进行比较以确定它是否已过期。如果已过期,则后端应返回响应代码401 Unauthorized
,以告知前端(您的Vue客户端)该令牌不再有效。
您可以做的是将到期检查逻辑放入中间件中,以查看请求标头的“授权”字段。