我具有基于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以防止此错误?还是什么?谢谢!