0

私はドキュメントを読み、passport_ldapauth とセッションを使用して、ログインとログアウトのエンドポイントで動作する Expressjs アプリを用意しました。セッションは、sequelize を使用してデータベースに保存され、セッション ID、有効期限、パス、およびドメインのみを含む Cookie がブラウザーに保存されます。

現在、他のエンドポイントを保護しようとしています。コンソールでは、デシリアライザーが最初にヒットし、適切なクエリがデータベースのセッション テーブルに送信され、適切なセッション ID でユーザーを検索して見つけていることがわかります。

しかし、その後、passport_ldapauth が呼び出され、パスワードがないため、「資格情報がありません」というフラッシュ メッセージと 400 が返されます。

これは、回答が得られなかった 2 番目のコメント ( https://github.com/vesse/passport-ldapauth/issues/53 ) でkav が言及していたことだと思います。

おそらく私はこれを複雑にしていますか?ユーザーが他のルートにログインしたら、「ldapauth」の代わりに「セッション」戦略 (存在する場合) に切り替える必要がありますか? それとも、これは機能するはずですが、そうではありませんか? それとも、私は何か間違ったことをしていますか?

問題のルートは次のとおりです。

api.post('/role/add', passport.authenticate(
    'ldapauth', {session: true, failureFlash: true}
  ), (req, res, next) => {
    Roles.create(req.body).then(
      role => res.json(role)
    ).catch(err => {
      if (err) {
        console.log(err);
        next(err);
      }
    });
  });

私を支援するために他に何を提供する必要がありますか?

おそらく私のシリアライザーまたはデシリアライザーが悪いのでしょうか? ログイン/ログアウトエンドポイントで機能するようです。下記参照:

passport.serializeUser(function(user, done) {
    let sessionUser = {
      username: user.sAMAccountName,
      sessionID: user.sessionID
    };
    done(null, sessionUser);
  });
  
passport.deserializeUser(function(user, done) {
    Session.findOne({where: {sid: user.sessionID}}).then(user => {
      return done(null, user);
    });
  });

Active Directory から返されるユーザー オブジェクトは非常に大きいことに注意してください。これが、最小限のユーザー名とセッション ID として全体を書き直す理由です。確かではありませんが、findOne によって返されるユーザーは、データベースの「データ」列に含まれる「パスポート」オブジェクトである場合とそうでない場合があると思います。うーん。そうであることを確認する必要がありますか?ユーザーが DB の行全体である可能性があります。

4

1 に答える 1

0

それはとてつもなく簡単でしたが、公式ドキュメントのどこにもこれを見つけることができませんでした。だから、パスポートを手に入れるのが難しい人のために、ここに私が見つけたものがあります.

req.isAuthenticated()

次のように、ルートの上または別のファイルに独自のミドルウェア関数を記述するだけです。

const unAuthMsg = 'You are not authorized for this endpoint.';

export const ensureAuthenticated = (req, res, next) => {
  if (req.isAuthenticated()) {
    next();
  } else {
    res.status(401).json({"message": unAuthMsg});
  }
};

次に、次のようにルートで使用します。

api.post('/role/add', ensureAuthenticated, (req, res, next) => {
Roles.create(req.body).then(role => {
  return res.json(role)
}).catch(err => {
  if (err) {
    console.log(err);
    next(err);
  }
});
  });

以上です。

于 2018-09-05T18:14:03.850 に答える