获取 "Can't serialize user" 错误,但从未调用 passport.serializeUser

Getting error of "Can't serialize user", but the passport.serializeUser is never called

我还在努力将护照添加到我的申请中!我明白了,这样我就不会再看到以前看到的疯狂的巨大错误,但应用程序一直在输出 {}。因此,在尽可能多地输入 console.log() 语句后,我将范围缩小到应用程序说它无法序列化用户对象这一事实,但据我所知 passport.serializeUser() 函数永远不会被调用。

GitHub link with all files (other than node modules)

当然,我不是 100% 了解 passport 的工作原理,而且我是 Node 的超级新手,但有多年使用其他语言的经验,所以如果我需要,我可以手工完成,但我'我更喜欢使用护照,因为它允许我最终使用 Facebook 和 Google 身份验证而无需重新制作轮子,可以这么说。

错误

这是确切的错误:

Passport Strategy jhechtf (password)

user found

passwords are good

Passport Authenticate : jhechtf

Passport Authenticate Err: null

Passport Authenticate Info: { message: 'Logged In Successfully' }

AuthController Error: [Error: Failed to serialize user into session]

现在我用 google 搜索了 "Failed to serialize user into session passport.js" 几乎所有可以想象到的术语,但每次它似乎总是带有 deserializeUser 而不是 serializeUser。让我印象深刻的一件事是,我从 serializeUser() 发出的 console.log() 呼叫在任何时间点都没有被看到。

AuthController.js

var passport = require('passport');

module.exports = {

    _config: {
        actions: false,
        shortcuts: false,
        rest: false
    },

    login: function (req, res) {

        passport.authenticate('local', function (err, user, info) {
            if(user==false){
                return res.status(403).send(info);
            }

            console.log("Passport Authenticate : ", user.username);
            console.log("Passport Authenticate Err: ", err);
            console.log("Passport Authenticate Info: ", info);
            req.logIn(user, function (err) {
                if (err) {  
                    console.log("AuthController Error: " , err);
                    return res.status(401).send(err);
                }
                //Assume a correct login?

                var red = req.session.redirectTo || '/'; 
                //get the redirection value if it was set.
                delete req.session.redirectTo;
                //Now that we've got it, delete it.
                res.redirect(red);
                //redirect
            });


        })(req, res);
    },

    logout: function (req, res) {
        req.logout();
        res.redirect('/');
    }
};

config/passport.js

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

passport.serializeUser(function (user, done) {
    console.log("Serialize User (passport.js) ", user);
//  if(user==false || user == undefined){
//      done({error:'user is not a user object, but is false or undefined'});
//  }
//  done(null, user.user_id);
    done(null,user.user_id);
});

passport.deserializeUser(function (id, done) {
    console.log("ID COMING IN AS: ", id);
    Users.findOne({
        user_id: id
    }, function (err, user) {
        return done(err, user);
    });
});

passport.use(new LocalStrategy({
        usernameField: 'username',
        passwordField: 'user_password'
    },
    function (un, password, done) {
        console.log("Passport Strategy ", un,password);

        Users.findOne({
            username: un
        }, function (err, user) {
            if (err) {
                console.log("USER.FINDONE ERROR ", err);
                return done(err,false,{message:'Can\'t find user'});
            }
            if (!user) {
                return done(null, false, {
                    message: 'Incorrect Username <small>Are you sure you signed up?</small>'
                });
            }
            console.log('user found');
            if (bcrypt.compareSync(password, user.user_password)) {
                console.log('passwords are good');
                return done(null, user, {
                    message: 'Logged In Successfully'
                });
            } else {
                return done(null, false, {
                    message: 'Invalid Password'
                });
            }

        });
    }
));

config/http.js(以防万一)

passportInit: require('passport').initialize(),
passportSession: require('passport').session(),

order: [
    'startRequestTimer',
    'cookieParser',
    'session',
    'myRequestLogger',
    'passportInit',
    'passportSession',
    'bodyParser',
    'handleBodyParserError',
    'compress',
    'methodOverride',
    'poweredBy',
    'router',
    'www',
    'favicon',
    '404',
    '500'
  ],

SQL 为 table

CREATE TABLE `users` (
    `user_id` int(11) NOT NULL AUTO_INCREMENT,
    `username` varchar(32) NOT NULL,
    `user_password` varchar(255) DEFAULT NULL,
    `user_salt` varchar(100) NOT NULL,
    `user_email` varchar(255) NOT NULL,
    `user_first_name` varchar(100) DEFAULT NULL,
    `user_last_name` varchar(255) DEFAULT NULL,
    `user_display_name` varchar(255) DEFAULT NULL,
    UNIQUE KEY `user_id` (`user_id`)
    ) ENGINE=InnoDB

感谢您的时间和耐心。

问题是你有两组用于 Passport 身份验证的库:sails-auth 包(包括一些模型、控制器、路由等)和 passport + passport-local 包(只是普通的 Passport 库)。看起来您实际上根本没有使用 sails-auth,但它仍然挂钩到您的应用程序并进行自己的 Passport 配置。我想这就是为什么您的 passport.serializeUser() 函数永远不会 "activated".

从您的 package.json 文件和 node_modules/ 目录中删除 sails-auth 以修复您的设置。