JWT令牌在一定时间后不会过期

时间:2019-11-05 00:48:50

标签: express jwt-auth express-jwt

为什么我的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代码

感谢帮助人员!

1 个答案:

答案 0 :(得分:0)

您的JWT令牌只是带有相关字段(例如expiresIniat)的经过编码+签名的JSON。

尽管它可能包含expiresIn字段,但这并不意味着后端服务器会尊重它。

需要在后端服务器中编写逻辑以解析时间戳,并与当前时间进行比较以确定它是否已过期。如果已过期,则后端应返回响应代码401 Unauthorized,以告知前端(您的Vue客户端)该令牌不再有效。

您可以做的是将到期检查逻辑放入中间件中,以查看请求标头的“授权”字段。