在LocalStrategy完成回调期间没有调用我的serializeUser

时间:2015-09-21 03:57:27

标签: javascript passport.js

我的问题是我收到错误“错误:无法将用户序列化为会话”。我很困惑,因为我设置了一个serializeUser函数,但它似乎没有被调用(我的console.log没有被打印)。

这是我正在关注羽毛护照教程: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)

1 个答案:

答案 0 :(得分: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;
    }));

我责备Passport莫名其妙地成为一个单身人士,因为没有早点注意到这一点。