2015-06-25 20 views
1

我正嘗試使用Facebook和本地策略進行多策略身份驗證。在Facebook的身份驗證,一般的工作和我的數據庫得到更新,但本地策略給了我以下錯誤:當使用本地策略進行身份驗證時,Passportjs引發500服務器錯誤

TypeError: undefined is not a function 
    at allFailed (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:111:15) 
    at attempt (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:160:28) 
    at Strategy.strategy.fail (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:277:9) 
    at Strategy.authenticate (/Users/r/Desktop/jb/node_modules/passport-local/lib/strategy.js:75:17) 
    at attempt (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:341:16) 
    at authenticate (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:342:7) 
    at Layer.handle [as handle_request] (/Users/r/Desktop/jb/node_modules/express/lib/router/layer.js:82:5) 
    at next (/Users/r/Desktop/jb/node_modules/express/lib/router/route.js:110:13) 
    at Route.dispatch (/Users/r/Desktop/jb/node_modules/express/lib/router/route.js:91:3) 
    at Layer.handle [as handle_request] (/Users/r/Desktop/jb/node_modules/express/lib/router/layer.js:82:5) 
    at /Users/r/Desktop/jb/node_modules/express/lib/router/index.js:267:22 
    at Function.proto.process_params (/Users/r/Desktop/jb/node_modules/express/lib/router/index.js:321:12) 
    at next (/Users/r/Desktop/jb/node_modules/express/lib/router/index.js:261:10) 
    at SessionStrategy.strategy.pass (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:318:9) 
    at SessionStrategy.authenticate (/Users/r/Desktop/jb/node_modules/passport/lib/strategies/session.js:67:10) 
    at attempt (/Users/r/Desktop/jb/node_modules/passport/lib/middleware/authenticate.js:341:16) 

這裏是代碼本身:

'use strict'; 

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

module.exports = function(app, User) { 

    app.use(passport.initialize()); 
    // Enable sessions 
    app.use(passport.session()); 

    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); } 
     if (!user.verifyPassword(password)) { return done(null, false); } 
     return done(null, user); 
     }); 
    } 
)); 

    passport.use(new FacebookStrategy({ 
     clientID: 1234544646, 
     clientSecret: "sertysehtrhr345345345234234", 
     callbackURL: "http://localhost:5000/auth/facebook/callback" 
    }, 
    function(accesstoken, tokenSecret, profile, done) { 
     // Could be an existing user or a new user 
     // profile.username is used as the username 
     User.findOrCreate({ 
     where: { 
      username: profile.id, 
      email: profile.emails[0].value, 
      displayName: profile.displayName 
     } 
     }).spread(function(user) { 
     return done(null, user); 
     }); 
    })); 

    // This just stores the username is an encrypted browser cookie 
    passport.serializeUser(function(user, done) { 
    done(null, user.username); 
    }); 

    // This fetches the user by username retrieved from the 
    // cookie that was set during serializeUser 
    passport.deserializeUser(function(uname, done) { 
    console.log(uname) 
    User.find({ 
     where: { 
     username: uname 
     } 
    }).then(function(user) { 
     if (!user) return done(new Error('Invalid user')); 
     return done(null, user); 
    }); 
    }); 

    // Redirect the user to facebook for authentication. When complete, Facebook 
    // will redirect the user back to the application at /auth/facebook/callback 
    //app.get('/auth/facebook', passport.authenticate('facebook')); 

    app.get('/auth/facebook', 
    passport.authenticate('facebook', { scope: ['email']}), 
     function(req, res){ 
    }); 
    // Facebook will redirect the user to this URL after approval. Finish the 
    // authentication process by attempting to obtain an access token. If access 
    // was granted, the user will be logged in. Otherwise, authentication has failed. 
    app.get('/auth/facebook/callback', 
    passport.authenticate('facebook', { 
     failureRedirect: '/login' 
    }), 
    function(req, res) { 
     res.cookie('signIn', 'true'); 
     res.redirect('/'); 
    } 
); 

    app.get('/api/users', function(req, res) { 
    res.render({ 
     message: req.flash('loginMessage') 
    }); 
    }); 

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

    // This is the middleware that needs to be used for 
    // protecting APIs that require authorization 
    return function(req, res, next) { 
    // if user is authenticated in the session, carry on 
    if (req.isAuthenticated()) 
     return next(); 

    // if they aren't redirect them to the login page /auth/twitter 
    res.redirect('/'); 
    }; 
}; 

我做一個崗位/ API /用戶。任何想法發生了什麼?

+0

要調用一個沒有被定義的功能。你甚至嘗試過調試嗎? –

+0

你將如何去調試呢?對不起,新的節點?什麼功能沒有定義? – rahul2001

+0

我不知道什麼功能,這就是你需要調試的東西。在幾乎所有編程平臺中都可以使用的簡單方法是使用寫入控制檯的函數。您將使用它來輸出一些值,並使用它們來跟蹤代碼的執行情況,以查看錯誤發生的位置。在node.js中,您要使用的函數是console.log。 –

回答

1

您已設置failureFlash爲true。這需要connect-flash中間件。 Express 2.x自己有這個,而在Express 3.x它有一個單獨的模塊。 因此,將failureFlash選項設置爲false或使用connect-flash

這就是Passport docs不得不說這

Note: Using flash messages requires a req.flash() function. Express 2.x provided this functionality, however it was removed from Express 3.x. Use of connect-flash middleware is recommended to provide this functionality when using Express 3.x.

相關問題