2016-12-22 16 views
2

Node.jsアプリケーションでpassportを正常に動作させるのに問題が発生しています。私はapp.jsで自分の要件を並べ替えようとしましたが、それでも動作させることはできません。これは私が取得していますエラーです:404が見つかりませんでした。Express 4でのパスポートの設定

Not Found 

404 

Error: Not Found 
    at /home/salma/Desktop/my-project/app.js:56:13 
    at Layer.handle [as handle_request] (/home/salma/Desktop/my-project/node_modules/express/lib/router/layer.js:95:5) 
    at trim_prefix (/home/salma/Desktop/my-project/node_modules/express/lib/router/index.js:312:13) 
    at /home/salma/Desktop/my-project/node_modules/express/lib/router/index.js:280:7 
    at Function.process_params (/home/salma/Desktop/my-project/node_modules/express/lib/router/index.js:330:12) 
    at next (/home/salma/Desktop/my-project/node_modules/express/lib/router/index.js:271:10) 
    at /home/salma/Desktop/my-project/node_modules/express/lib/router/index.js:618:15 
    at next (/home/salma/Desktop/my-project/node_modules/express/lib/router/index.js:256:14) 
    at next (/home/salma/Desktop/my-project/node_modules/express/lib/router/route.js:121:14) 
    at complete (/home/salma/Desktop/my-project/node_modules/passport/lib/middleware/authenticate.js:250:13) 
    at /home/salma/Desktop/my-project/node_modules/passport/lib/middleware/authenticate.js:257:15 
    at pass (/home/salma/Desktop/my-project/node_modules/passport/lib/authenticator.js:421:14) 
    at Authenticator.transformAuthInfo (/home/salma/Desktop/my-project/node_modules/passport/lib/authenticator.js:443:5) 
    at /home/salma/Desktop/my-project/node_modules/passport/lib/middleware/authenticate.js:254:22 
    at /home/salma/Desktop/my-project/node_modules/passport/lib/http/request.js:60:7 
    at pass (/home/salma/Desktop/my-project/node_modules/passport/lib/authenticator.js:267:43) 
    at serialized (/home/salma/Desktop/my-project/node_modules/passport/lib/authenticator.js:276:7) 
    at /home/salma/Desktop/my-project/config/passport.js:9:9 
    at pass (/home/salma/Desktop/my-project/node_modules/passport/lib/authenticator.js:284:9) 
    at Authenticator.serializeUser (/home/salma/Desktop/my-project/node_modules/passport/lib/authenticator.js:289:5) 
    at IncomingMessage.req.login.req.logIn (/home/salma/Desktop/my-project/node_modules/passport/lib/http/request.js:50:29) 
    at Strategy.strategy.success (/home/salma/Desktop/my-project/node_modules/passport/lib/middleware/authenticate.js:235:13) 

は、ここに私のコードです:

app.js:

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var mongoose = require('mongoose'); 
var flash = require('connect-flash'); 
var passport = require('passport'); 
var session = require('express-session'); 
var routes = require('./routes/index'); 
var userRoutes = require('./routes/user'); 
var adminRoutes = require('./routes/admin'); 
var config = require('./config/index.js'); 
var MongoStore = require('connect-mongo')(session); 

var app = express(); 

mongoose.Promise = global.Promise; 
var db = mongoose.connect(config.dbUrl, config.dbOpts); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(cookieParser()); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 

var store = new MongoStore({ 
    mongooseConnection: db.connection 
}); 

app.use(session({ 
    secret: config.sessionSecret, 
    store: store, 
    resave: true, 
    saveUninitialized: true 
})); 

app.use(flash()); 
app.use(passport.initialize()); 
app.use(passport.session()); 
require('./config/passport')(passport); 

app.use('/', routes); 
app.use('/', userRoutes); 
app.use('/admin', adminRoutes); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 
}); 

mongoose.connection.on('open', function(){ 
    mongoose.connection.db.listCollections(function(error, names) { 
    if (error) { 
     throw new Error(error); 
    } else { 
     names.map(function(name) { 
     console.log('found collection %s', name); 
     }); 
    } 
    }); 
}); 

mongoose.connection.on('error', function(error){ 
    throw new Error(error); 
}); 

module.exports = app; 

と、このルートでの私のログです:

routes/user.js:

var express = require('express'); 
var User = require('../controllers/user'); 
var passport = require('passport'); 
var router = express.Router(); 

router.get('/', function(req, res, next) { 
    res.send('respond with a resource'); 
}); 

router.post('/login', passport.authenticate('local', 
    { successFlash: 'Success!', 
    failureFlash : 'Login failed' })); 

config/passport.js:

var LocalStrategy = require('passport-local').Strategy; 
var User = require('../models/user').model; 
var configAuth = require('./auth'); 

module.exports = function (passport) { 
    passport.serializeUser(function (user, done) { 
     done(null, user.id); 
    }); 
    passport.deserializeUser(function (id, done) { 
     User.findById(id, function (err, user) { 
      done(err, user); 
     }); 
    }); 
    passport.use('local', new LocalStrategy({ 
     usernameField : 'email', 
     passwordField : 'password', 
     passReqToCallback : true 
    }, 
    function(req, email, password, done) { 
     User.findOne({ email : email }, function(err, user) { 
      if (err) return done(err); 
      if (!user) 
       return done(null, false, req.flash('loginMessage', 'This email does not exist.')); 
      if (!user.validPassword) 
       return done(null, false, req.flash('loginMessage', 'Oops! The password entered is incorrect.')); 
      return done(null, user); 
     }); 
    })); 
    passport.use(new FacebookStrategy({ 
     clientID: configAuth.facebookAuth.clientID, 
     clientSecret: configAuth.facebookAuth.clientSecret, 
     callbackURL: configAuth.facebookAuth.callbackURL, 
     profileFields: ["emails", "displayName", "name"] 
    } 
} 

私はルートがapp.jsで見られていると、彼らが正常に動作を確認するために、同じルートファイル内の他のルートを試してみました:、これは私が私のpassport認証戦略を扱うファイルです。これだけはしません。誰かが私が間違っていることを教えてもらえますか?

+0

'user'モデルを表示できますか? –

+0

@ravishankarご回答いただきありがとうございます。私は問題を認識し、今答えを投稿します:) – SalmaFG

+0

私は私の答えで言った問題は、それは有効かどうか?本当ですか、serializeUser'で 'user._id'に変更しましたか? –

答えて

2

エラーメッセージから、serializingdeserializingのユーザーの間に問題が発生していると推測されています。

あなたがやっているのはとても簡単な間違いです。

ユーザーは、あなたがdeserializingながら、それは、functionIDを取得し、userコレクションでそれを見つけるの問題を持っていない理由(私は推測する)ことがありますundefinedあるuser.idを行っているserializingながら。

user.idの代わりにuser._idである必要があります。それを変えれば、あなたは行かなくてはなりません。

置き換え:

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

をして:

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

はそれがお役に立てば幸いです。

2

問題がルートオプションsuccessFlashfailureFlashにありました。 passport.authenticate()関数は、そうでなければ正しく動作しない別のオプションを必要としていました。私はオプションを交換したときにそうように正確ドキュメントを一致させる:

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

または

passport.authenticate('local', function(err, user, info) { 
      if (err) return res.status(500).send(); 
      if (!user) return res.status(400).json({error:info.message}); 
      req.logIn(user, function(err) { 
       if (err) return next(err); 
       return res.status(200).json(info.message); 
      }); 
     })(req, res, next); 

それが働きました。関数を呼び出す方法は他にもあります。 http://passportjs.org/docs/authenticate

+1

私のケースを解決しました。リダイレクトしたくない場合は、app.post( '/ login'、...)にコールバックを指定する必要があります。そうでなければ、ログインに成功すると404で応答します。 – Bjarke

関連する問題