JWT令牌过期时删除cookie的正确方法

时间:2019-04-16 19:47:00

标签: node.js reactjs express cookies jwt

我具有基于jwt的身份验证,它对GET调用有效,但它经常会导致连接错误,例如net :: ERR_CONNECTION_RESET,net :: ERR_CONNECTION_ABORTED等。在令牌过期后执行POST请求后,我进行了研究并了解到它是由Cookie引起的,所以我检查了浏览器,并没有删除包含过期的jwt令牌的cookie,但是当我刷新页面服务器时发送了401 HTTP代码并重定向我登录页面(这很好,因为这是我的中间件的目的)

所以我现在要做的只是检查令牌是否不存在,我发送401代码并将用户重定向到登录页面(在未经授权的用户尝试到达此中间件保护的路由时发生),否则jwt进行验证该令牌,如果有错误,我检查错误名称s'jwt expired'以及是否为 我发送401状态并在此之前清除cookie。否则,我会生成“ req.userId”,这是该代码:

const guardr = (req, res, next) =>{
    const token = req.body.token ||
              req.query.token ||
              req.headers['x-access-token'] ||
              req.cookies.token;

if(!token){

    return res.status(401).send({redirect: true, location: '/sign-in'})
}  
else{
    jwt.verify(token, process.env.SECRET, function (err,decoded){
        if(err){
            if(err.message === 'jwt expired'){
                  res.clearCookie('token')
                  return res.status(401).send({redirect: true, location: '/sign-in'})               
            }


            console.log(err.message)
            return res.status(500).send({
                message: err.message
            })
        }

        req.userId = decoded.id;
        next()
       })
    }            
}

但是正如我说的那样,大多数情况下它不能与POST请求一起正常工作,我说这主要是因为当前我正在使用带有此代码的formdata发送数据

 const data = new FormData();

data.append('image', this.fileRef.current.files[0]);
data.append('name', this.state.name);
...

并且此代码大部分返回上面的错误,但是如果我将files [0]更改为文件,它不会返回该错误,但是文件上传不起作用(即使令牌消失了(令牌cookie为空))。在我的服务器端,我没有做任何复杂的事情,我只是获取与formdata一起发送的变量并将其记录下来。但是,如果我的混合机配置在这里很重要

     const storage = multer.diskStorage({

destination: (req, file, callback) => {
 const userPath = path.join(imgStoragePath, req.userId);
 fs.mkdir(
  userPath,
  () => callback(null, userPath)
  )
},

filename: (req, file, callback) => {
const filenameParts = file.originalname.split('.');
const ext = filenameParts.pop();
const basename = filenameParts.join('.');
const additionalPath = Date.now() + '' + uuid() + '' + 
Math.floor(Math.random() * (2000 - 500)) + 500;
    callback(null, basename + '-' + additionalPath + '.' + ext);
  }

})

const upload = multer({
 storage,
 limits: '1mb',
 onError: function(err, next){
 next(err)
 }
})

然后我使用此代码通过axios发送请求

 axios({
      method: 'post',
      url: '/api/recipes',
      config: {headers: {'Content-Type': 'multipart/form-data' }},
      data: data
 })
 .then(res => {
    console.log(res.data);
 })
 .catch(err => {
   if(err.response){
     if(err.response.data.redirect === true){
       window.location.replace(err.response.data.location)
     }
     if(err.response.data.message){
        alert(err.response.data.message)
     }
  }
});

那么通过设置与令牌完全相同的失效日期,如何在令牌过期时删除cookie以防止此错误?还是什么?谢谢!

0 个答案:

没有答案