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,其中包含 expiresIniat 等相关字段。

虽然它可能包含expiresIn 字段,但这并不意味着后端服务器会接受它。

需要在后端服务器写入逻辑来解析时间戳,与当前时间做比较判断是否已经过期。如果过期了,后端应该返回一个401 Unauthorized的响应码告诉前端(你的Vue客户端)这个token已经失效了。

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

【讨论】:

以上是关于JWT 令牌在一定时间后不会过期的主要内容,如果未能解决你的问题,请参考以下文章

过期后使用刷新令牌获取访问令牌(JWT)

我如何在 jwt 令牌中设置过期 30 分钟

PHP JWT:: **解码** 过期令牌

Django REST JWT 刷新

python jwt中令牌过期时如何提取jwt令牌有效负载

为啥我的 JWT 不记名身份验证在令牌说 5 分钟后将令牌识别为过期?