web-dev-qa-db-ja.com

各node.jsリクエストで認証資格情報を確認します

ユーザーを認証するために、Expressとconnect-authでnode.jsを使用しています。

これは、/ indexを要求するときの検証です。

if(req.isAuthenticated()) {
  res.redirect('/dashboard');
} else {
  res.render('index', { layout: 'nonav' });
}

ただし、ログアウトしてf.e. '/ dashboard'、ダッシュボードを表示できます。

すべてのリクエストに認証チェックを適用して、常に有効なユーザーが存在することを確認するにはどうすればよいですか?

更新認証に問題はありません。すべて正常に動作します!アプリ全体で有効なユーザーが必要なので、ルート実装に関数やifステートメントを配置せずに、有効なユーザーがいるかどうかすべてのルート/リクエストをチェックするソリューションが必要です。 Express-Authentication-Exampleはルート定義で「制限」を使用していますが、これは近いですが、多くのルートでは簡単に忘れられてしまいます。

26
Patrick
app.all('*',function(req,res,next){
    if(req.isAuthenticated()){
        next();
    }else{
        next(new Error(401)); // 401 Not Authorized
    }
});
// NOTE: depending on your version of express,
// you may need to use app.error here, rather
// than app.use.
app.use(function(err,req,res,next){
    // Just basic, should be filled out to next()
    // or respond on all possible code paths
    if(err instanceof Error){
        if(err.message === '401'){
            res.render('error401');
        }
    }
});

allルートを認証を必要とするルートの前に定義し、ルートを後にしない場合(ホームページ、ログインなど)、それはそれを必要とするルートにのみ影響を与えるはずです。または、'*'の代わりにRegExpを使用することもできます。これには、認証が必要なサブパスまたはパスのリストが含まれます。

別のオプションは、authを必要とする各ルートに含める関数を作成することです。

function IsAuthenticated(req,res,next){
    if(req.isAuthenticated()){
        next();
    }else{
        next(new Error(401));
    }
}
app.get('/login',function(req,res,next){
    res.render('login');
});
app.get('/dashboard',IsAuthenticated,function(req,res,next){
    res.render('dashboard');
});
app.get('/settings',IsAuthenticated,function(req,res,next){
    res.render('settings');
});
35
Zikes

sessionsが提供するconnectメカニズムを使用できます。このコードをapp.configure()に入れて有効にします。

  app.use(express.cookieParser());
  app.use(express.session({
    secret: 'some string used for calculating hash'
  }));

その後、req.sessionオブジェクト(リクエストごとに異なる)を使用して、認証データ(またはその他のもの)を保存できます。したがって、サンプルコードは次のようになります。

if (req.session && req.session.authorized) {
  res.redirect('/dashboard');
}
else {
  res.render('index', {layout: 'nonav'});
}

認証は次のようになります。

req.session.authorized = checkPassword(login, passw);

ログアウト:

req.session.destroy();

詳細は here を参照してください。

5

別の方法は、ミドルウェア機能をapp.useすることです。 ( CoffeeScript の例)

# middleware
authKick = (req, res, next) ->
  if not do req.isAuthenticated then return res.redirect '/login'
  return do next

# apply
app.use authKick

これは、ルートに手を加える必要なく、各リクエストで機能します。

0
Nelo Mitranim