35

認証とセッション処理にパスポートを使用しています。これまでのところ、すべて正常に動作しています。新しいユーザーをアプリに追加するための「サインイン」フォームを実装しました。ユーザーを追加したら、そのユーザーを自動的にログインさせたいと考えています。

これを達成するための最良の方法は何ですか-ユーザー資格情報を使用して「/ 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('/');
        }
    });
});

誰かがこれを行う方法を知っていますか?

4

3 に答える 3

50

パスポートガイド に基づいて、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()関数から発生します。

于 2013-09-25T02:32:55.850 に答える