我在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"时会显示一个页面。登录时。
任何人都可以帮忙解决这个问题。
答案 0 :(得分:0)
快速回答是,通过cookie而不是标题发送JWT,浏览器将为您完成工作。
请注意,只有您拥有Web客户端才能实现此目的。为了支持本机客户端,您基本上需要通过航空公司在标头中发送JWT,或让客户端指定它是否需要在标头或cookie中。原生客户不能很好地处理cookie。
如果您想坚持使用标头,则需要在客户端(JavaScript)应用程序中使用网络层,该网络层将JWT作为标头添加到发出JWT的服务器的每个传出请求中。 (确保将JWT存储在客户端的安全存储中。使用cookie,您也可以免费获得。)
您可能无论如何都要使用此层,具体取决于JWT到期时后端的行为方式。常见的设置是客户端需要检测JWT何时过期(后端通常响应401)和(尝试)在后台再次登录。