在节点 request.headers 中设置权限
Set authorization in Node request.headers
我正在尝试向客户端发送 Passport-Local 登录请求以供 Satellizer 分析,我希望服务器端发送授权令牌的请求。不幸的是, request.headers
中没有密钥 authorization
:
{ host: 'localhost:3000',
connection: 'keep-alive',
'cache-control': 'max-age=0',
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' }
登录函数重定向到这里,这里是调用ensureAuthenticated()
的地方。
app.get('/main', ensureAuthenticated, function(req, res, next){
res.render('main.ejs', { token: createSendToken(req.user, config.secret), id: req.user._id, username: req.user.username, authorization: req.user.authorization });
});
ensureAuthenticated()
然后分析登录请求并确保令牌匹配:
function ensureAuthenticated(req, res, next) {
if (!req.headers.authorization) {
return res.status(401).send({ message: 'Please make sure your request has an Authorization header' });
}
var token = req.headers.authorization.split(' ')[1];
var payload = null;
try {
payload = jwt.decode(token, config.token_secret);
}
catch (err) {
return res.status(401).send({ message: err.message });
}
if (payload.exp <= moment().unix()) {
return res.status(401).send({ message: 'Token has expired' });
}
req.user = payload.sub;
next();
}
然后重定向并显示消息
{ message: 'Please make sure your request has an Authorization header' }
如何将授权密钥设置为 request.headers?
要在请求中设置一个新的 header 字段,只需直接访问它,因为 headers object 看起来像一个普通的散列 table.
request.headers.authorization = value;
所以解决方案很简单,尽管有点工作量:我需要创建自己的自定义护照登录函数,以便在调用 ensureAuthenticated()
函数之前发送令牌。
旧登录功能:
app.post('/auth/login', passport.authenticate('local-login',
{ successRedirect: '/main',
failureRedirect: '/login',
message: null,
failureFlash: true
}));
新的自定义登录功能:
app.post('/auth/login', function(req, res, next){
passport.authenticate('local-login', function(err, user, info){
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.login(user, function(err){
var token = createSendToken(user, config.secret);
if (err) { return next(err); }
if (token == (null || undefined)) { return next(err); }
res.status(200).send({ token: token });
});
})(req, res, next);
});
一旦它被重定向到 /main
,就会调用 ensureAuthenticated()
函数,一切正常。
我正在尝试向客户端发送 Passport-Local 登录请求以供 Satellizer 分析,我希望服务器端发送授权令牌的请求。不幸的是, request.headers
中没有密钥 authorization
:
{ host: 'localhost:3000',
connection: 'keep-alive',
'cache-control': 'max-age=0',
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' }
登录函数重定向到这里,这里是调用ensureAuthenticated()
的地方。
app.get('/main', ensureAuthenticated, function(req, res, next){
res.render('main.ejs', { token: createSendToken(req.user, config.secret), id: req.user._id, username: req.user.username, authorization: req.user.authorization });
});
ensureAuthenticated()
然后分析登录请求并确保令牌匹配:
function ensureAuthenticated(req, res, next) {
if (!req.headers.authorization) {
return res.status(401).send({ message: 'Please make sure your request has an Authorization header' });
}
var token = req.headers.authorization.split(' ')[1];
var payload = null;
try {
payload = jwt.decode(token, config.token_secret);
}
catch (err) {
return res.status(401).send({ message: err.message });
}
if (payload.exp <= moment().unix()) {
return res.status(401).send({ message: 'Token has expired' });
}
req.user = payload.sub;
next();
}
然后重定向并显示消息
{ message: 'Please make sure your request has an Authorization header' }
如何将授权密钥设置为 request.headers?
要在请求中设置一个新的 header 字段,只需直接访问它,因为 headers object 看起来像一个普通的散列 table.
request.headers.authorization = value;
所以解决方案很简单,尽管有点工作量:我需要创建自己的自定义护照登录函数,以便在调用 ensureAuthenticated()
函数之前发送令牌。
旧登录功能:
app.post('/auth/login', passport.authenticate('local-login',
{ successRedirect: '/main',
failureRedirect: '/login',
message: null,
failureFlash: true
}));
新的自定义登录功能:
app.post('/auth/login', function(req, res, next){
passport.authenticate('local-login', function(err, user, info){
if (err) { return next(err); }
if (!user) { return res.redirect('/login'); }
req.login(user, function(err){
var token = createSendToken(user, config.secret);
if (err) { return next(err); }
if (token == (null || undefined)) { return next(err); }
res.status(200).send({ token: token });
});
})(req, res, next);
});
一旦它被重定向到 /main
,就会调用 ensureAuthenticated()
函数,一切正常。