web-dev-qa-db-ja.com

パスポートでエクスプレスの静的フォルダーを保護する方法

パスポートに基づく認証が必要なエクスプレスに基づくプロジェクトがあります。

バックオフィスは、静的ファイルとして提供されるangularjsアプリです。

私の認証コードは、完全に https://github.com/jaredhanson/passport-local/blob/master/examples/express3-no-connect-flash/app.js に基づいています

認証されていない場合、angularアプリを提供しません。/adminルートにensureAuthenticatedを追加しようとしましたが、ルートが機能しません(404)。管理者が提供されます。

app.use(express.static(path.join(__dirname, 'public')));
app.use('/admin', ensureAuthenticated, express.static(path.join(__dirname, 'admin')));
//serve routes
app.use(app.router);

パブリックフォルダにはログインページが含まれています。

どうすればこれを達成できますか?

26
toutpt

ミドルウェアを使用してルートを確認し、ログインしておらず管理ページにアクセスしている場合はリダイレクトします(未テスト):

app.use(function(req, res, next) {
    if (req.user == null && req.path.indexOf('/admin') === 0)
    {
        res.redirect('/login');
    }
    next(); 
});
18
MikeSmithDev

同じ問題にぶつかりました、これが私がやったことです!

app.useでは、そのようにミドルウェアを連鎖させることはできません。さまざまなapp.VERB関数はサポートしていますが、app.useはサポートしていません。それは一度に一つのミドルウェアのためです。

2つのミドルウェアを別々の呼び出しに分割すると、目的の結果が得られます。

app.use('/admin', ensureAuthenticated);
app.use('/admin', express.static(path.join(__dirname, 'admin')));

エクスプレスを使用して静的ファイルを提供している間は基本認証を使用できません

28
Bobz
app.use('/admin', function(req,res,next){
 if(req.user){
   return express.static(path.join(__dirname, 'public'));
 } else {
   res.render(403, 'login', {message:'Please, login!'});
 }
});

//serve routes
app.use(app.router);
6
vodolaz095

_[email protected]+_、_[email protected]_、および_[email protected]_の更新

最初にパスポート認証戦略を設定します。 jwtを使用する場合、クエリパラメータからトークンを取得できます。そうでない場合は、別のExtract関数(またはJwt.ExtractJwt.fromExtractors()を使用して複数)を使用できます

_passport.use('basic-user',
    new Jwt.Strategy({
        ...jwtConfig.options,
        jwtFromRequest: Jwt.ExtractJwt.fromUrlQueryParameter('token')
    }, verifyUser)
);
_

次に、静的ファイルを提供する前にパスポート認証機能を使用できます

_app.use('/files', [
    passport.authenticate(['basic-user'], { session: false }),
    express.static(path.join(__dirname, 'files')) //make sure you access proper directory
])
_
0
l2ysho