在 header 中传递 jwt

passing jwt in header

我在 nodejs 中创建了一个项目来检查 jwt 是如何工作的。我已将身份验证放在可以与邮递员一起验证的路线上。尽管我希望在用户登录时通过验证路由呈现页面。我正在使用 handlebars.js 进行模板化。谁能帮我实现这个目标。

index.js(路线)

var ctrlUsers = require('../controllers/users.controllers.js');
router
.route('/users/login')
.post(ctrlUsers.login);

app.use(ctrlUsers.authenticate);
.get(ctrlUsers.authenticate,ctrlUsers.showaddress);

module.exports = router

users.controller.js

module.exports.login = function(req, res) {
console.log('logging in user');
var username = req.body.username;
var password = req.body.password;
User.findOne({
username: username
})
.exec(function(err, user) {
if (err) {
  console.log(err);
  res.status(400).ender('error');
} 
 else {
  if (bcrypt.compareSync(password, user.password)) {
    console.log('User found', user);
    var token = jwt.sign({ username: user.username }, 's3cr3t', { expiresIn: 3600 });
    console.log("Token1" + token);
    res
    .status(200)
    .redirect('/');
  } else {
    res
    .status(401)
    .render('error');
  }
  }
  });
  };

  module.exports.showaddress = function(req, res) {
  res.render('index');
  console.log("I am in");
  console.log(req.user);
  }


 module.exports.authenticate = function(req, res, next) {
 var headerExists = req.headers.authorization;
 console.log(headerExists);
 if (headerExists) {
 var token = req.headers.authorization.split(' ')[1]; 
 jwt.verify(token, 's3cr3t', function(error, decoded) {
  if (error) {
    console.log(error);
    console.log("Token 2" + token);
    res.status(401).json('Unauthorized');
  } 
  else {
    req.user = decoded.username;
    console.log("Here");
    next();
  }
 });} else { console.log("Token 3" + token) res.status(403).json('No token provided'); } };

在与 Postman 核对后,这一切正常。我只是不确定如何让它在浏览器上运行。就像它应该在我登录时点击“http://localhost:3000/users/showaddress”时显示一个页面。

谁能帮忙解决这个问题。

快速回答是,通过 cookie 而不是 header 发送 JWT,浏览器将为您完成这项工作。

请注意,这只有在您只有网络客户端时才有可能。为了也支持本地客户端,您基本上需要通过航空公司在 header 中发送 JWT,或者让客户端指定它是否需要在 header 或 cookie 中。本机客户端不能很好地处理 cookie。

如果您想坚持使用 header,您的客户端 (JavaScript) 应用程序中需要一个网络层,将 JWT 作为 header 添加到每个传出请求发布 JWT 的服务器。 (确保将 JWT 存储在客户端的安全存储中。使用 cookie,您也可以免费获得它。)

您可能会根据后端在 JWT 过期时的行为方式对这一层进行处理。一个常见的设置是客户端需要检测 JWT 何时过期(后端通常响应 401)并(尝试)在后台再次登录。