2015-09-21 31 views
0

我的問題是我收到錯誤「錯誤:無法序列化用戶進入會話」。我很困惑,因爲我已經設置了serializeUser函數,但它似乎沒有被調用(我的console.log沒有被打印)。我的serializeUser沒有在LocalStrategy完成回調期間被調用

這是當我正在關注的羽毛護照教程:http://feathersjs.com/learn/authorization/

注:我懷疑的是,羽毛護照採用了不同的「護照」的對象不是我自己的圖書館。不幸的是,我不知道我會如何回憶這樣一個問題。在我看來,這只是Passport可怕的設計,並不是通過傳遞實例來工作,而是直接將事物附加到自身上。

我使用設立護照系列化和認證以下內容:

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

function GetPassport(userService, Passport) { 
    console.log('passport has been prepared.\n'); 
    Passport.serializeUser(function(user, done) { 
     console.log('user: ', user); 
     done(null, user._id); 
    }); 

    Passport.deserializeUser(function(id, done) { 
     userService.get(id, {}, done); 
    }); 

    Passport.use(new LocalStrategy(function(username, password, done) { 
     userService.authenticate(username, password, done); 
    })); 

    return Passport; 
} 

module.exports = GetPassport; 

然後我用:

var userService = UserService(config.db); 
var passport = GetPassport(userService); 
app.post('/login', passport.authenticate('local')); 

如果您需要更多的細節在這裏是UserService:

var MongoDB = require('feathers-mongodb'); 
var Crypto = require('crypto'); 

var UserService = function(database) { 
    return MongoDB({ 
     db: database, 
     collection: '_users', 
    }).extend({ 
     authenticate: function(username, password, callback) { 
      this.find({query: {username: username}}, function(error, users) { 
       if(error) 
        callback(error); 

       var user = users[0]; 
       if(!user) 
        return callback(new Error('No User Found')); 

       if(user.password !== hash(password, user.salt)) 
        return callback(new Error('Password Is Incorrect')); 

       //success, return the authenticated user 
       return callback(null, user); 
      }); 
     }, 
     setup: function() { 
      this.before({ 
       create: function(hook, next) { 
        //Create the salt 
        var salt = Crypto.randomBytes(128).toString('base64'); 
        hook.data.salt = salt; 
        hook.data.password = hash(hook.data.password, hook.data.salt); 

        next(); 
       }, 
      }); 
     }, 
    }); 
}; 

module.exports = UserService; 

function hash(string, salt) { 
    var shasum = Crypto.createHash('sha256'); 
    shasum.update(string + salt); 
    return shasum.digest('hex'); 
} 

錯誤跟蹤:

Error: Failed to serialize user into session 
    at pass (/Users/funk/Development/Projects/generic_rest_server/node_modules/feathers-passport/node_modules/passport/lib/authenticator.js:277:19) 
    at Authenticator.serializeUser (/Users/funk/Development/Projects/generic_rest_server/node_modules/feathers-passport/node_modules/passport/lib/authenticator.js:295:5) 
    at IncomingMessage.req.login.req.logIn (/Users/funk/Development/Projects/generic_rest_server/node_modules/passport/lib/http/request.js:48:29) 
    at Strategy.strategy.success (/Users/funk/Development/Projects/generic_rest_server/node_modules/passport/lib/middleware/authenticate.js:228:13) 
    at verified (/Users/funk/Development/Projects/generic_rest_server/node_modules/passport-local/lib/strategy.js:83:10) 
    at /Users/funk/Development/Projects/generic_rest_server/user-service.js:22:24 
    at /Users/funk/Development/Projects/generic_rest_server/node_modules/feathers-mongodb/node_modules/mongoskin/node_modules/mongodb/lib/mongodb/cursor.js:158:16 
    at commandHandler (/Users/funk/Development/Projects/generic_rest_server/node_modules/feathers-mongodb/node_modules/mongoskin/node_modules/mongodb/lib/mongodb/cursor.js:651:16) 
    at /Users/funk/Development/Projects/generic_rest_server/node_modules/feathers-mongodb/node_modules/mongoskin/node_modules/mongodb/lib/mongodb/db.js:1670:9 
    at Server.Base._callHandler (/Users/funk/Development/Projects/generic_rest_server/node_modules/feathers-mongodb/node_modules/mongoskin/node_modules/mongodb/lib/mongodb/connection/base.js:382:41) 

回答

0

答案在我的筆記中。

這應該是其他人誰卡住以下幫助: 「http://feathersjs.com/learn/authorization/

您必須提供護照選項FeathersPassport電話。如果不是,羽毛護照以及使用不同版本的護照,一個比你加serializeUser到:

app.configure(FeathersPassport(function(result) { 
     // MongoStore needs the session function 
     var MongoStore = ConnectMongo(result.createSession); 

     result.secret = 'noymysecret'; 
     result.store = new MongoStore({ 
      db: config.db, 
     }); 
     result.resave = false; 
     result.saveUninitialized = false; 

     //*HERE*// 
     result.passport = passport; 
     //**// 

     return result; 
    })); 

我責怪護照莫名其妙地被一個單身,沒有注意到這個越快。

相關問題