6

Satellizer によって分析される Passport-Local ログイン要求をクライアント側に送信しようとしています。サーバー側からの要求で認証トークンを送信したいと考えています。残念ながら、 にはキーがありませauthorizationrequest.headers:

{ 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 に認証キーを設定するにはどうすればよいですか?

4

2 に答える 2

9

ヘッダー オブジェクトは通常のハッシュ テーブルのように見えるため、リクエストに新しいヘッダー フィールドを設定するには、直接アクセスするだけです。

request.headers.authorization = value;
于 2016-02-10T13:36:01.383 に答える
0

したがって、少し手間がかかりますが、解決策は簡単でした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);
});

リダイレクトされると/mainensureAuthenticated()関数が呼び出され、すべてが正常に機能します。

于 2016-02-11T08:22:08.677 に答える