在 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)并(尝试)在后台再次登录。
我在 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)并(尝试)在后台再次登录。