Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js JWT令牌过期时删除cookie的正确方法_Node.js_Reactjs_Express_Cookies_Jwt - Fatal编程技术网

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

Node.js JWT令牌过期时删除cookie的正确方法,node.js,reactjs,express,cookies,jwt,Node.js,Reactjs,Express,Cookies,Jwt,我有基于jwt的身份验证,它对GET调用很有效,但它经常会导致连接错误,如net::ERR\u connection\u RESET、net::ERR\u connection\u ABORTED等。在令牌过期后执行POST请求后,我研究了它,并了解它是由Cookie引起的,所以我检查了浏览器,它并没有删除cookie,包括过期的jwt令牌,但当我刷新页面服务器时,发送了401 HTTP代码,并将我重定向到登录页面(这很好,因为这是我的中间件的用途) 所以我现在唯一要做的就是,检查令牌是否不存在

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

所以我现在唯一要做的就是,检查令牌是否不存在,我发送401代码并重定向用户到登录页面(当未经授权的用户试图访问由该中间件保护的路由时会发生这种情况),否则jwt会验证该令牌,如果有错误,我会检查错误名称是否“jwt已过期”,如果是 在此之前,我发送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);
...
 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)
     }
  }
});
这段代码主要返回上面的错误,但如果我将文件[0]更改为文件,则不会返回该错误,但文件上载不起作用(一旦令牌消失(令牌cookie为空))。在我的服务器端,我不做任何复杂的事情,我只是用formdata发送变量并记录它们。但如果我的multer配置在这里很重要,是吗

     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发送请求,代码如下

 const data = new FormData();

data.append('image', this.fileRef.current.files[0]);
data.append('name', this.state.name);
...
 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,通过设置与令牌完全相同的过期日期来防止此错误?还是怎样谢谢