在Node request.headers中设置授权
我试图发送一个Passport-Locallogin请求到客户端,由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' }
loginfunction在这里redirect,这是调用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()
然后分析login请求,并确保令牌匹配:
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(); }
然后redirect并显示消息
{ message: 'Please make sure your request has an Authorization header' }
我将如何设置一个授权密钥request.headers?
要在请求中设置一个新的头字段,只需直接访问它,因为头对象看起来像一个正常的哈希表。
request.headers.authorization = value;
所以这个解决scheme很简单,虽然工作很简单:我需要创build自己的自定义护照login函数,在ensureAuthenticated()
函数之前发送一个令牌。
旧的loginfunction:
app.post('/auth/login', passport.authenticate('local-login', { successRedirect: '/main', failureRedirect: '/login', message: null, failureFlash: true }));
新的自定义loginfunction:
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); });
一旦它被redirect到/main
那么将ensureAuthenticated()
函数,并且所有东西都按照它应该的那样工作。