2

認証が失敗した場合にフラッシュを送信する際に問題があります。すべてがOKであることを除いて。例 ( https://github.com/jaredhanson/connect-flash ) をアプリのフラッシュ メッセージにコピーすると、問題なく動作します...

これが私のコードです:

//routes
app.get('/login', function (req,res){
    res.render('login', {
        authMessage: req.flash('authMessage')
    });
});

app.post('/login', passport.authenticate('local', {
    failureRedirect: '/login',
    failureFlash: true
    }), function(req,res){
    res.send('ok');
});

//local strategy
passport.use(new LocalStrategy(
    function(username, password, authCheckDone) {
        UserDetails.findOne({username : username}).then(
            function(user){
                if (!user) {
                    console.log('bad username');
                    return authCheckDone(null, false, {authMessage: 'Wrong name'});
                }
                if (user.password !== password) {
                    console.log('bad password');
                    return authCheckDone(null, false, {authMessage: 'Wrong password'});
                }
                return authCheckDone(null, user);
            }),
            function(error){
                return authCheckDone(error);
        };
    }
));

//ejs
<% if (authMessage.length > 0) { %>
    <p>test</p>
    <%= authMessage %>
<% } %>

この問題はセキュリティに関連しており、https を使用していない可能性があることをどこかで読んだことがありますが、それが github の例である場合はどちらも機能しません...

4

1 に答える 1

2

私が間違っていなければ、あなたが渡すコールバックはLocalStrategy最初のパラメータとしてリクエストオブジェクトを持つべきです。したがって、関数は次のようになります。

function(req, username, password, authCheckDone) {
    // your code

その後、私が持っている例によればauthCheckDone、次の方法で結果を返す必要があります。

return authCheckDone(null, false, req.flash('authMessage', "your message"));

LocalStrategyただし、次の方法でオブジェクトを作成してください。

new LocalStrategy({
    passReqToCallback: true // don't forget this
}, function(req, username, password, authCheckDone) {
于 2016-01-10T18:18:44.893 に答える