2013-08-09 7 views
9

私はpassport-localとexpressを使ってユーザログインを処理しています。これまでのところ、ユーザー名を使用しながらログインに成功しましたが、ユーザー名は覚えにくいので、個人的にはユーザーの操作に使うべきではないと思うので、パスポート関連のサンプル戦略を修正しました。ローカルページで電子メールでユーザーを確認できますが、コードは機能しません。Passport-localで電子メールを使用します。以前の助けが役に立たなかった

私は電子メールを持っている戦略は次のとおりです。

passport.use(new LocalStrategy(function(email, password, done) { 
    User.findOne({ email: email }, {}, function(err, user) { 
    if (err) { return done(err); } 
    if (!user) { return done(null, false, { message: 'Unknown user ' + e }); } 
    user.comparePassword(password, function(err, isMatch) { 
     if (err) return done(err); 
     if(isMatch) { 
     return done(null, user); 
     } else { 
     return done(null, false, { message: 'Invalid password' }); 
     } 
    }); 
    }); 
})); 

、それはこの戦略に由来しています:

//The login strategy 
passport.use(new LocalStrategy(function(username, password, done) { 
    User.findOne({ username: username }, function(err, user) { 

    if (err) { return done(err); } 
    if (!user) { return done(null, false, { message: 'Unknown user ' + username }); } 
    user.comparePassword(password, function(err, isMatch) { 
     if (err) return done(err); 
     if(isMatch) { 
     return done(null, user); 
     } else { 
     return done(null, false, { message: 'Invalid password' }); 
     } 
    }); 
    }); 
})); 

ので、ユーザ名の戦略は完全に正常に動作しますが、電子メールの1ではありません。私はユーザ名とメール戦略の両方でconsole.log()を残して、どのような戦略が戻ってきたのかを見ていました。電子メールの戦略は

を返しながら、ユーザー名の戦略は、ユーザーのすべての情報を返します。私はなぜサイトがこれをやっているのか分かりません。私は別のポストに見てきた

一つの解決策は、私は、ユーザーを見つけるために電子メールでログインする

findOne({email: email}, function(err, user){ 
}); 

オプションを使用することを示唆したが、それがすべてで働いていません。ここで

ジェイドは、私は、ユーザからの入力を取るために使用するファイルです。

extends layout 

block content 
    h1 Login 

    form(action= '/login', method='post') 
     p Email 
      br 
      input#email(type='text',value='',placeholder='@',name='email') 
     p Password 
      br 
      input#password(type='password',value='',placeholder='Password',name='password') 
     input(type='submit') Submit 

そしてここでは、POST入力です:

// POST /login 
// This is an alternative implementation that uses a custom callback to 
// acheive the same functionality. 
exports.postlogin = function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err) } 
    if (!user) { 
     req.session.messages = [info.message]; 
     return res.redirect('/login') 
    } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/'); 
    }); 
    })(req, res, next); 
}; 

一体ここで何が起こっていますか?電子メールでは完全に動作するはずです。とにかく私は質問をしているので、誰かが登録した後でどのようにメールを確認するのですか?

答えて

32

LocalStrategyコールバックの引数の名前を "email"に変更したようです。パスポートはフィールドが電子メールであることを自動的には知りませんが、あなたはそれを伝えなければなりません。

デフォルトでは、LocalStrategyは、usernameとpasswordという名前のパラメータでクレデンシャルを検索することを想定しています。あなたのサイトがこれらのフィールドに異なる名前を付けたい場合は、デフォルトを変更するオプションが利用できます。

passport.use(new LocalStrategy({ 
    usernameField: 'email', 
    passwordField: 'passwd' 
    }, 
    function(username, password, done) { 
    // ... 
    } 
)); 

Source

+5

私はそこに魔法があることを誓います。一番長い間、私はこの問題を解決しようとしました。私はあなたが前に投稿した例を試しましたが、今まで働いたことはありませんでした。どうもありがとうございました! – Kivo360

+0

'passwordField'は' password'です。imo –

0

パスポートを理解することは少し複雑です。私は同じ問題を抱えていました。私は入力を「電子メール」と命名するのではなく、私の見解(.ejs)上で「username」という名前に変更しました。

メール

ありがとう!

関連する問題