私は議論のすべてを読みましたが、まだ理解できません。 Passport Js Webサイトのドキュメントは非常に曖昧です。Passport js serializeUser&deserializeUser
私はpassport-ldapauth戦略でPassport JSを使用しています。 私はデータベースを持っていません。 私は明らかに、それぞれのリクエストでLDAPサーバにヒットしたくありません。私は初めてLDAPを使ってパスポート戦略を使用してPOST /login
ルートでユーザーを認証し、そのユーザーをセッションに保存して、その後の各要求に対してユーザーが既にログインしているかどうかを確認したいと考えています。
セッションを使用しようとしていますが、シリアライズ/デシリアライズフローでPassport +セッションを使用する方法を理解できません。 私がチェックしたすべての例では、deserializeUser関数でUser.findOneを使用しました。
今のところ私はPassportのセッションの使用を無効にしました。私はreq.session.user != null
をチェックするカスタムミドルウェアを使用しています。その場合、ユーザーは既にログインしていて、私はnext()
になります。それ以外の場合は、ログインにリダイレクトします。
は、いくつかのコード(簡略化のために、私が質問に関連していないコードを削除した)である:
パスポート構成:
var express = require('express'),
session = require('express-session'),
passport = require('passport'),
LdapStrategy = require('passport-ldapauth');
var app = express();
var LdapStrategyOptions = {
server: {
url: '<url>',
bindDN: '<dn>',
bindCredentials: "<pwd>",
searchBase: '<searchBase>',
searchFilter: '<filter>'
}
};
passport.use(new LdapStrategy(LdapStrategyOptions));
app.use(cookieParser());
app.use(session({
store: new LokiStore({autosave: false}),
resave: false,
saveUninitialized: false
secret: env.get("SESSION_SECRET")
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(passport.initialize());
ルート:
// LOGIN ROUTE
app.get('/login',
function(req, res) {
res.render('login');
});
// LOGIN HANDLER ROUTE
app.post('/login',
passport.authenticate('ldapauth', { session: false }),
function(req, res) {
req.session.userId = req.user.cn;
req.session.user = {
"userId": req.user.cn,
"displayName": req.user.displayName
};
res.redirect('/');
});
// LOGOUT ROUTE
app.get('/logout',
function(req, res) {
req.session.destroy(function(err) {
req.logout();
res.redirect('/');
});
});
// HOME ROUTE
app.get('/', isLoggedIn, function(req, res) {
res.render('home');
});
IsLoggedInミドルウェア:
var isLoggedIn = function(req, res, next) {
if (req.session.user != null){
console.log("is auth ok '" + req.session.user.userId +"'");
return next();
}
console.log("redirect to auth/login");
res.redirect('/auth/login');
}
私は何が欠けていますか?セットアップにセキュリティ上の欠陥はありますか? 何か助けていただければ幸いです。
'app.use(passport.session());'が不足している可能性がありますか? –
番号。私が書いたように、私はpassport.deserializeUser()で何を書かなければならないのか理解できないので、サンプルコードから削除しました。 サンプルセッションは、カスタムセッション管理で動作させる方法と同じです。 – Roberto