web-dev-qa-db-ja.com

NodeJS + Express:URLを保護する方法

NodeJSおよびExpressJS(MVC用)の最新バージョンを使用しています。

私は通常、次のように、残りのパスを構成します。

app.get('/archive', routes.archive);  

/admin/*の一連のURLを保護したいのですが、単純な認証が必要なだけで、ドラフトにすぎません。

ユーザーが/admin/postsなどにアクセスしようとすると、対応するビューとデータを送信する前に、req.session.authenticatedをチェックします。定義されていない場合は、ログインページにリダイレクトします。

ログインページには単純な検証フォームとサインインコントローラーメソッドがあります。ユーザーが「正しいユーザー」と「正しいパスワード」を送信した場合、セッション変数を設定して認証されます。

私が難しいと思う、または理解できないのは、実際に"filter"コードを作成する方法です。つまり、すべての/ admin/*パスを呼び出す前に、認証チェックを行います。

これは「ミドルウェア」エクスプレス機能と関係がありますか?

ありがとうございました

24
Fabio B.

はい、ミドルウェアはまさにあなたが欲しいものです。ミドルウェア関数は、実際のルートハンドラーの前に実行されることを除けば、他のExpressルートハンドラーと同じように機能する関数です。たとえば、次のようなことができます。

function requireLogin(req, res, next) {
  if (req.session.loggedIn) {
    next(); // allow the next route to run
  } else {
    // require the user to log in
    res.redirect("/login"); // or render a form, etc.
  }
}

// Automatically apply the `requireLogin` middleware to all
// routes starting with `/admin`
app.all("/admin/*", requireLogin, function(req, res, next) {
  next(); // if the middleware allowed us to get here,
          // just move on to the next route handler
});

app.get("/admin/posts", function(req, res) {
  // if we got here, the `app.all` call above has already
  // ensured that the user is logged in
});

app.all/admin/*で呼び出す代わりに、保護するルートのeachへのミドルウェアとしてrequireLoginを指定できますが、ここに示す方法により、/adminで始まるページに誤って追加するのを忘れることがありません。

71
Michelle Tilley

さらに簡単な方法は、App.jsファイルに次のコードを追加することです。

var auth = function(req, res, next) {

    if(isAdmin) {

        return next();

    } else {

        return res.status(400)

    }
};

app.use('/admin', auth, apiDecrement);

ご覧のとおり、ミドルウェアがルートにアタッチされています。 ExpressJSが進む前に、2番目のパラメーターとして渡した関数を実行します。

このソリューションを使用すると、エンドユーザーにサイトを表示する前に、さまざまなチェックを行うことができます。

ベスト。

3
David Gatti

ブランドンのようですが、connectルートに行くこともできます

app.use('/admin', requireLogin)
app.use(app.router)

app.get('/admin/posts', /* middleware */)
1
Jonathan Ong