在我开始使用reactJS之前,我正在使用Express会话(当然使用expressJS)来确定用户是否已通过身份验证,我的中间件是通过/ profile URL传递的,例如router.use('/profile', middleware, require('./profilePageFile'))
,并且如果用户未通过身份验证我正在使用简单代码重定向到登录页面
if(!req.session.user){
res.redirect('/login')
}
我也尝试过使用带有react的重定向,但是由于react具有它自己的路由系统(react-router-dom),并且仅当我登录/ profile url时才需要Express来创建API,因此它仍向我显示页面内容和在xxx毫秒后重定向我,我认为如果我的个人资料页面和主页都位于默认url('domain.com/')上,这将是更好的做法,因为我看到许多网站都在使用包括Facebook这样的技术我试图做这样的事情:如果用户没有令牌或令牌已过期,请不要显示“您好用户”按钮,否则请显示它。我唯一的问题是我不知道该怎么做。 如果我的布尔状态为isAuthenticated或类似的根据我从服务器端发送的标头确定用户是否经过身份验证的布尔值,那么我认为这对安全性是不好的做法,而且在尝试时那,它还是不管用。在这一点上,我唯一能做的就是如果令牌存在,则将req.userId传递给客户端。这行得通,但还不够,如果有人明白我的意思,我会很高兴 这是我的中间件代码
const guard = (req, res, next) => {
const token =
req.body.token ||
req.query.token ||
req.headers["x-access-token"] ||
req.cookies.token;
if (!token) {
res.status(401).send({ auth: false });
} else {
jwt.verify(token, process.env.SECRET, function(err, decoded) {
if (err) {
return res.status(500).send({
message: err.message
});
}
req.userId = decoded.id;
res.status(200).send({ auth: true });
next();
});
}
};
答案 0 :(得分:1)
我对您的代码进行了两项更改。
const guard = (req, res, next) => {
const token = req.body.token ||
req.query.token ||
req.headers['x-access-token'] ||
req.cookies.token;
if (!token) {
// Authentication failed: Token missing
return res.status(401).send({ auth: false })
}
jwt.verify(token, process.env.SECRET, function (err, decoded) {
if (err) {
// Authentication failed: Token invalid
return res.status(401).send({
auth: false,
message: err.message
})
}
req.userId = decoded.id
next()
})
}
首先,在if(err)
条件内,我将状态代码更改为401
,因为如果令牌无效,则会在此处引发错误。
第二,我从函数底部删除了res.status(200).send({auth:true})
。
这是因为中间件应该传递到路由(我们正在尝试通过JWT检查保护该路由)进行响应。这是在到达实际路线之前对请求的响应。