ユーザーを認証するために、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はルート定義で「制限」を使用していますが、これは近いですが、多くのルートでは簡単に忘れられてしまいます。
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');
});
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 を参照してください。
別の方法は、ミドルウェア機能を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
これは、ルートに手を加える必要なく、各リクエストで機能します。