私はドキュメントを読み、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 の行全体である可能性があります。