Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.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令牌验证_Node.js_Reactjs_Express_Jwt - Fatal编程技术网

Node.js 主页面上的jwt令牌验证

Node.js 主页面上的jwt令牌验证,node.js,reactjs,express,jwt,Node.js,Reactjs,Express,Jwt,在我开始使用reactJS之前,我使用expressJS的express sessions来确定用户是否经过身份验证,我的中间件会像这个路由器一样传入/profile URL。使用“/profile”,中间件,需要“/profilePageFile”,如果用户未经身份验证,我会用简单的代码重定向到登录页面 if(!req.session.user){ res.redirect('/login') } 我也尝试使用react重定向,但由于react有自己的路由系统react路由器dom和ex

在我开始使用reactJS之前,我使用expressJS的express sessions来确定用户是否经过身份验证,我的中间件会像这个路由器一样传入/profile URL。使用“/profile”,中间件,需要“/profilePageFile”,如果用户未经身份验证,我会用简单的代码重定向到登录页面

if(!req.session.user){
  res.redirect('/login')
}
我也尝试使用react重定向,但由于react有自己的路由系统react路由器dom和express,仅在我登录/profile url时创建API时才需要,因此它仍然显示页面内容,并在xxx毫秒后重定向我,我认为如果我的个人资料页面和主页都在默认的url“domain.com/”上会更好,因为我看到很多网站都在使用这种技术,包括Facebook,此时我正在尝试这样做:如果用户没有令牌或令牌过期,不要显示一些hello user按钮,否则就显示它。我唯一的问题是我不知道怎么做。 如果我的react状态中有一个布尔值,称为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();
    });
  }
};

我对您的代码做了两处更改

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()
    })
}
首先,在IFER条件内,我已将状态代码更改为401,因为如果令牌无效,它将在此处引发错误

其次,我已经从函数底部删除了res.status200.send{auth:true}。
这是因为中间件应该通过JWT检查传递到我们试图保护的路由以响应。这是在请求到达实际路由之前对其进行的响应。

我可以做什么来代替发送{auth:false}?您具体要求什么?如何编写JWT检查中间件,或者如何在React中选择性地显示组件?基本上是的。如何编写JWT检查中间件?你能帮我吗?很遗憾,你没有理解我的意思。我会尝试一些东西,如果我不能成功,我会更详细地解释我的问题。我将暂时把这个问题留在这里,但是如果你能更新你的问题,突出你的特定问题或问题。我们可以在聊天室里谈吗?因为这里很难解释哦,别再担心了,我想我解决了这个问题