1

私は Passport.js を使用するのは初めてですが、これまでのところかなりうまくいっています。私はパスポートローカルでパスポートを使用しています。

ただし、1 ページを除くディレクトリ全体に対して認証を要求したいと考えています。したがって、私のノードサーバーでは、このディレクトリを次のように提供しています(エクスプレスを使用):

app.use("/admin", express.static(__dirname + "/admin"));

そして、ユーザーに /admin/login.html をヒットさせたいので、次のようなことをしたいと思いました:

app.get('/gb-admin/login.html', function(req, res){ });

次に、残りの認証を要求したいので、次のようにします。

app.get('/gb-admin/*', ensureAuthenticated, function(req, res){});

これが役立つ場合の参照用の、私の ensureAuthenticated 関数です。

function ensureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) { return next(); }
  res.redirect('/gb-admin/login.html')
}

どうすればこれを行うことができますか?私は通常、無限ループで物事を送信し、ブラウザをタイムアウトさせてきました。誰でも助けることができますか?

4

2 に答える 2

2

タイムアウトが発生する理由は、空のルート ハンドラーを持つことができないためです。ある時点で、応答を返すか、次のルート ハンドラー/ミドルウェアに要求を渡す必要があります。

そうは言っても、これを試してください:

function ensureAuthenticated(req, res, next) {
  if (req.path === '/gb-admin/login.html' || req.isAuthenticated()) {
    return next();
  }
  res.redirect('/gb-admin/login.html')
}

app.get('/gb-admin/*', ensureAuthenticated, function(req, res, next) {
  next();
});

// the static middleware needs to be declared after the route above, otherwise
// it will take precedence and ensureAuthenticated will never be called.
app.use("/gb-admin", express.static(__dirname + "/admin"));

ログインページの別のルートで動作させる方法はないと思います(login.htmlそのルートハンドラーなしで実際に読み取りと返送を実装しない限り)。したがって、ensureAuthenticatedミドルウェアでチェックします。

于 2013-04-11T06:05:39.663 に答える
1

それはあなたのコールバックなのだろうか。試す:

app.get('/gb-admin/*', function (req, res, next) {
  ensureAuthentication(req, res, next) {
    if (req.isAuthenticated()) { return next(); }
    res.redirect('/gb-admin/login.html')
  });
});
于 2013-04-11T01:52:37.303 に答える