在标题中传递jwt

时间:2018-05-06 08:10:05

标签: node.js handlebars.js jwt express-jwt

我在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"时会显示一个页面。登录时。

任何人都可以帮忙解决这个问题。

1 个答案:

答案 0 :(得分:0)

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

请注意,只有您拥有Web客户端才能实现此目的。为了支持本机客户端,您基本上需要通过航空公司在标头中发送JWT,或让客户端指定它是否需要在标头或cookie中。原生客户不能很好地处理cookie。

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

您可能无论如何都要使用此层,具体取决于JWT到期时后端的行为方式。常见的设置是客户端需要检测JWT何时过期(后端通常响应401)和(尝试)在后台再次登录。