認証とセッション処理にパスポートを使用しています。これまでのところ、すべてうまくいきます。アプリに新しいユーザーを追加するための「サインイン」フォームを実装しました。ユーザーが追加された後、自動的にログインしたいと思います。
これを達成するための最良の方法は何ですか-ユーザーの資格情報で「/ login」にリダイレクトする必要がありますか、それとも別の/より良い方法(serializeUserを呼び出す)がありますか?
これまでのところ、(serializeUserおよびLocalStrategyの)「完了」関数の動作方法や、それが何をしているかは、本当に理解していなかったと思います...
これが私のコードです:
passport.serializeUser(function(user, done) {
done(null, user._id);
});
passport.deserializeUser(function(id, done) {
authProvider.findUserById('users', id, function (err, user) {
done(err, user);
});
});
passport.use(new LocalStrategy( function(email, password, done) {
authProvider.getUserByEmail('users', email, function(error, user){
if(error) { return done(error); }
if (!user) { return done(null, false, { message: 'Unknown user ' + email });}
if (user.password != password) { return done(null, false);}
return done(null, user);
});
}
));
app.post('/login',
passport.authenticate('local', { failureRedirect: '/login'}),
function(req, res) { res.redirect('/');});
app.post('/sign', function(req, res){
authProvider.saveUser(...do stuff), function(error, user){
if(error){
res.redirect('/sign');
} else {
res.redirect('/');
}
});
});
誰かがこれを行う方法を知っていますか?
@ Westonの回答 のコードを使用してください。
このようなものになるはずです
app.post('/sign', function(req, res){
authProvider.saveUser(...do stuff), function(error, user){
if(error){
res.redirect('/sign');
} else {
passport.authenticate('local')(req, res, function () {
res.redirect('/account');
})
}
});
});
戦略の名前はわかりませんが、デフォルトではLocalStrategyは「ローカル」名を提供する必要があります
パスポートガイドreq.login()
に基づくのは、まさにこの目的のためです。
この関数は主にユーザーがサインアップするときに使用され、その間に
req.login()
を呼び出して、新しく登録されたユーザーに自動的にログインできます。
Krasuのコードの変更:
_app.post('/sign', function(req, res){
authProvider.saveUser(...do stuff), function(error, user){
if ( error ){
res.redirect('/sign');
} else {
req.login(user, function (err) {
if ( ! err ){
res.redirect('/account');
} else {
//handle error
}
})
}
});
});
_
login()
コールバックからの潜在的なエラーは、serializeUser()
関数から発生します。
試してみる:
app.post('/sign', function(req, res){
authProvider.saveUser(...do stuff), function(error, user){
passport.authenticate('local', (err, user) => {
req.logIn(user, (errLogIn) => {
if (errLogIn) {
return next(errLogIn);
}
return res.redirect('/account');
});
})(req, res, next);
});
});