开始在 node.js 中使用 JWT

Posted

技术标签:

【中文标题】开始在 node.js 中使用 JWT【英文标题】:Starting to use JWT in node.js 【发布时间】:2020-07-24 00:41:27 【问题描述】:

我正在尝试在 node.js 应用程序中使用 JWT。 我关注了this tutorial。

但是我在中间件层面遇到了问题:

function authenticateToken(req, res, next)

视频中的时间是 10:30。

当我运行代码时,我总是有:

authHeader == null

我尝试了各种方法来为 req.headers['authorization'] 找到其他可能的形式,例如 req.headers.authorization,但无济于事。

我需要说我的应用程序中有一条路由允许我登录,并且我在使用该路由到达中间件之前就使用了该路由。但在任何情况下,authHeader 一直是 null

我应该怎么做才能确保我得到一个有效的 authHeader 以使应用按照教程中的方式工作并继续前进?

如果这可能有用,这里是中间件功能的完整代码:

function authenticateToken(req, res, next) 
  // Get the jwt access token from the request header.
  const authHeader = req.headers['authorization']
  const token = authHeader && authHeader.split(' ')[1]

  if (token == null) 
    console.log('authenticateToken-401')
    return res.sendStatus(401)
  

  jwt.verify(token, 'myBigSecret', (err, user) => 
    console.log(err)
    if (err) 
      console.log('authenticateToken-403')
      return res.sendStatus(403)
    

    req.user = user
    next()
  )

还有用户登录时运行的代码:

app.post('/login', async function(req, res) 
  Parse.initialize(process.env.APP_ID);
  Parse.serverURL = process.env.SERVER_URL;
  Parse.User.logIn(req.body.usrname, req.body.password, 
    success: user => 
      // Let us handle this using JWT.
      const jwtUser = name: req.body.usrname
      const accessToken = jwt.sign(jwtUser, 'myBigSecret')
      res.setHeader("Authorization", 'Bearer '+accessToken);

      res.json(accessToken: accessToken)
    ,
    error: (user, error) => 
      console.log('Error: '+error);
      res.render('pages/login.ejs', );
    ,
  );
);

【问题讨论】:

你能显示你的ajax代码吗? 我没有 Ajax 代码。请让我知道您需要查看代码的哪一部分。 我的意思是你初始化授权的前端代码 看起来你没有在 ajax 调用中设置标题 @Bibek 因为我是第一次尝试 JWT,我并不完全明白你的意思,但我在帖子中添加了处理日志部分的代码;希望这能回答你的问题。 【参考方案1】:

您需要在请求中设置标头,看起来您没有在请求中设置标头

【讨论】:

我不记得我在教程中看到过关于设置标题的任何内容,但我可能以某种方式错过了。 你应该如何在不设置的情况下从标题中获取数据【参考方案2】:

在上面的登录代码中,您已经使用 jwt 进行了签名,以便客户端应用程序想要访问后端上的一些受限路由时可以使用它 现在,每当客户端想要从前端访问路由时,您需要在 ajax 中将授权令牌设置为标头类似这样的东西

$.ajax(
  url: "/apiyouwanttoaccess",
  method: "GET",
  headers:  Authorization: "Bearer " + Cookies.get("token") 
)

上面的 ajax 代码应该在您想要访问安全路由的 js 代码附近。 您已经在登录时签署了令牌(第二个代码 sn-p),因此可以通过设置 cookie 在特定用户中使用它

【讨论】:

我明白了,我开始了解它是如何工作的。不过,我还不确定我应该在代码中的哪个位置存储 cookie。 尽管我更改了代码并尝试了几种变体。它仍然无法正常工作。第一个问题是我设置的标头(使用 res.setHeader)似乎从未反映在 authenticateToken 函数中。我暂时还没有设置 cookie。 如果我在设置标头后立即使用 authenticateToken 调用路由,我应该能够在没有 cookie 的情况下进行测试。正确的?但即使这是可能的,我也不完全确定如何调用这条路线来进行测试。 例如登录是一个调用安全路由的按钮,您可以在其中进行 ajax 调用,保留标题,并且登录内可能还有其他页面您想要访问,可以这样做 我明白我需要做什么。请参阅我的帖子“res.setHeader”,在“app.post('/login',...”内)。但它不起作用。这就是问题所在。而且我没有使用 Ajax。

以上是关于开始在 node.js 中使用 JWT的主要内容,如果未能解决你的问题,请参考以下文章

Node.js开发指南 BYVoid3.1 开始使用 Node.js编程

Node.js(初识)

从零开始学习渗透Node.js应用程序

楼赛第11期Node.js挑战赛下周开始,实际工作的问题等你挑战

如何发布一个自定义Node.js模块到NPM(详细步骤)

2016年企业与 Node.js 的故事