5

node.jsアプリで Passport.js を使用して、MongoDB でユーザーを認証しようとしています。私は成功したことはありません。

投稿では、「email」:「email@gmail.com」、「password」:「test」を送信します。

var passport = require('passport')
   , LocalStrategy = require('passport-local').Strategy;


app.post('/login',
  passport.authenticate('local', { successRedirect: '/',
                               failureRedirect: '/fail' })
);

passport.use(new LocalStrategy({
      emailField: 'email',
      passwordField: 'passw',
   },
function (emailField, passwordField, done) {
   process.nextTick(function () {
      db.collection(users, function (error, collection) {
         if (!error) {
            collection.findOne({
               'email': emailField,
               'password': passwordField
            }, function (err, user) {
               if (err) {
                  return done(err);
               }
               if (!user) {
                  console.log('this email does not exist');
                  return done(null, false);
               }
                  return done(null, user);
            });
         } else {
            console.log(5, 'DB error');
         }
      });
   });
}));

MongoDB の「ユーザー」コレクション:

{
    "_id": {
        "$oid": "533b5283e4b09d8a1148b4c4"
    },
    "email": "email@gmail.com",
    "password": "test"
}

データベースに正しく接続していないのかもしれませんが、よくわかりません。

また、関数全体をログに記録すると、ログはまったく取得されません。私は単に得る

 POST /login 302 7ms - 39b  
 GET /fail 404 3ms

どんな提案でも大歓迎です。私は何かが欠けているかもしれないと思いますが、これをどのように構造化するのか正確にはわかりません。データベースに書き込んでいる他の関数では、次を使用する必要があります。

var uristring = 
process.env.MONGOLAB_URI || 
process.env.MONGOHQ_URL || 
'mongodb://<myurlhere>';

mongo.connect(uristring, function (err, db) {

ここに更新されたコードがあります

これらを必要とします:

   , passport = require('passport')
   , LocalStrategy = require('passport-local').Strategy;

これらを使用して:

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.cookieParser());
app.use(express.session({ secret: 'keyboard cat'}));
app.use(logfmt.requestLogger());
app.use(express.static(path.join(__dirname, 'public')));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);

// User authentication passport

passport.use(new LocalStrategy(
    {
        usernameField: 'email',
        passwordField: 'passw',
    },
    function (userId, password, done) {
        // removed process.nextTick
        console.log('Hey! no more 400 error!');
        db.collection(users, function (error, collection) {
            if (!error) {
                collection.findOne({
                    'email': userId,
                    'password': password
                }, function (err, user) {
                    if (err) {
                        return done(err);
                    }
                    if (!user) {
                        console.log('this email does not exist');
                        return done(null, false);
                    }
                    return done(null, user);
                });
            } else {
                console.log(5, 'DB error');
            }
        });
    } 
));

passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(user, done) {
  done(null, user);
});

app.post('/login', passport.authenticate('local'), function(req, res) {
   console.log('SUCCESS WOOOO');
   // If this function gets called, authentication was successful.
   // `req.user` contains the authenticated user.
   //res.redirect('/users/' + req.user.username);
  });

このコードはPOST /login 400 10ms、/login に投稿するときに常に表示されます。私の他のすべてのルートは正常に機能します。

4

2 に答える 2

2

これは、Postmanの問題になりました(問題なく何度も使用しました)。

実際の html フォームを使用すると、問題なく動作しました。たぶんヘッダーのこと?

于 2014-04-20T14:23:40.303 に答える