【问题标题】:jwt token validation on main page主页上的 jwt 令牌验证
【发布时间】:2019-03-14 02:55:15
【问题描述】:

在我开始使用 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 时创建 API 时才需要 express,它仍然向我显示页面内容和在 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();
    });
  }
};

【问题讨论】:

  • 除了发送 {auth:false} 还能做什么?
  • 你具体要问什么?如何编写 JWT 检查中间件或如何在 React 中选择性地显示组件?
  • 基本上是的。如何编写 JWT 检查中间件
  • 你能帮我吗?

标签: node.js reactjs express jwt


【解决方案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 检查来保护它)来响应。这是在到达实际路线之前响应请求。

【讨论】:

  • 很遗憾你没有明白我的意思。我会尝试一些事情,如果我不会成功,我会更详细地解释我的问题
  • 我暂时将其留在这里,但如果您可以更新您的问题以突出显示您遇到的特定问题或问题。
  • 我们可以聊天吗?因为这里很难解释
  • 哦,别担心我解决了问题,(我想)
猜你喜欢
  • 2019-06-23
  • 2017-07-27
  • 2019-10-20
  • 2016-01-17
  • 2018-03-07
  • 2018-10-16
  • 2019-11-01
  • 2019-07-29
  • 2021-08-24
相关资源
最近更新 更多