24

だから私はパスポートローカルとエクスプレスを使ってユーザーログインを処理しています。これまでのところ、ユーザー名を使用して正常にログインできましたが、ユーザー名は覚えにくく、個人的にはユーザーを処理するために使用する必要はないと思うので、パスポートで提供されているサンプル戦略を変更してみました-電子メールでユーザーを確認するためのローカル ページですが、コードは機能しません。

私がメールに対して持っている戦略は次のとおりです。

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' });
      }
    });
  });
}));

したがって、ユーザー名戦略は完全に機能しますが、電子メール戦略はそうではありません. ユーザー名と電子メール戦略の両方に console.log() を残して、戦略が何を返しているかを確認しました。ユーザー名戦略はユーザーに関するすべての情報を返しますが、電子メール戦略は戻ります

間違い

. このサイトがこれを行っている理由がわかりません。これまでに見た解決策はどれも機能しません。

別の投稿で見た 1 つの解決策では、

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

メールでログインしてユーザーを見つけるオプションがありますが、まったく機能していません。

ユーザーからの入力を取得するために使用する Jade ファイルは次のとおりです。

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);
};

ここで一体何が起こっているのですか?電子メールを使用すると、完全に機能するはずです。あと、質問なので、登録後のメールはどうやって確認すればいいですか?

4

4 に答える 4

56

LocalStrategy コールバックの引数の名前を「email」に変更したようです。Passport は、フィールドの名前が email であることを自動的に認識するわけではありませんが、指定する必要があります。

デフォルトでは、LocalStrategy は、username および password という名前のパラメーターで資格情報を見つけることを想定しています。サイトでこれらのフィールドに別の名前を付けたい場合は、デフォルトを変更するオプションを利用できます。

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

ソース

于 2013-08-09T07:30:13.563 に答える