Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Node request.headers中设置授权_Javascript_Node.js_Express_Passport.js_Satellizer - Fatal编程技术网

Javascript 在Node request.headers中设置授权

Javascript 在Node request.headers中设置授权,javascript,node.js,express,passport.js,satellizer,Javascript,Node.js,Express,Passport.js,Satellizer,我正试图向客户端发送Passport本地登录请求,由Satellizer进行分析,我希望服务器端的请求发送授权令牌。不幸的是,请求中没有密钥授权。标题: { 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'

我正试图向客户端发送Passport本地登录请求,由Satellizer进行分析,我希望服务器端的请求发送授权令牌。不幸的是,
请求中没有密钥
授权
。标题

{ 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 });
});
确保重新验证()
然后分析登录请求并确保令牌匹配:

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();
}

如何将授权密钥设置为request.headers?

要在请求中设置新的头字段,只需直接访问它,因为头对象看起来像一个普通的哈希表

request.headers.authorization = value;

因此,解决方案很简单,尽管工作量不大:我需要创建自己的自定义passport登录函数,以便在调用
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);
});
新的自定义登录功能:

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()
函数,一切都正常工作。

您是否尝试过在标题中设置
authorization
键?我该怎么做?
request.headers.authorization=value
好的,我可以猜到。在这种情况下,在我的代码中,最好在哪里设置?护照认证期间?一个全新的函数?我还没有看到你的代码,很难猜到。:)谢谢你的帮助。我会找到一个放置这段代码的好地方,我会很快发布答案。您应该能够这样做:
app.post('/auth/login',passport.authenticate('local-login',{failureRedirect:'/login'},function(res,req){//your success function};