使用谷歌社交登录护照和续集

时间:2015-08-06 14:27:31

标签: node.js passport.js sequelize.js

嗨,大家好,这是我的第一个问题所以请耐心等待,我在使用护照和续集时遇到问题,问题发生在我在数据库中搜索记录以检查用户是否已存在但护照反序列化时,Sequelize执行五个'选择查询',代码类似于我在scotch.io中发现的一个我刚刚附上sequelize api:

module.exports = function (passport) {

    // used to serialize the user for the session
    passport.serializeUser(function (user, done) {
        done(null, user.iduser);
    });

    // used to deserialize the user
    passport.deserializeUser(function (id, done) {
        userModel.findById(id)
        .then(function (userVo) {
            done(null, userVo);
        }).catch(function(err) {
            if(err)
                throw err;
        })
    });

    passport.use(new GoogleStrategy({
            clientID: 'XXXXX',
            clientSecret: 'XXXXXX',
            callbackURL: 'XXXXX'
        },
        function (token, refreshToken, profile, done) {
            // make the code asynchronous
            // User.findOne won't fire until we have all our data back from Google
            process.nextTick(function () {
                // try to find the user based on their google id
                sequelize.transaction(function (t) {
                        return sociaLoginModel.findOne({
                                where: {
                                    idprovided: profile.id,
                                    logintype: constants.GOOGLE_LOGIN_TYPE
                                }
                            }, {
                                transaction: t
                            })
                            .then(function (socialLoginResult) {
                                //if user was found, then retrieve and create a session for him returning the value to done
                                var socialLoginVo;
                                if (socialLoginResult) {
                                    socialLoginVo = socialLoginResult.dataValues
                                    return userModel.findById(socialLoginVo.tb11_fkuser, {
                                            transaction: t
                                        })
                                        .then(function (userResult) {
                                            return userResult.dataValues;
                                        });
                                } else {
                                    return individualsModel.create({
                                            name: profile.displayName
                                        }, {
                                            transaction: t
                                        })
                                        .then(function (individualsResult) {
                                            var individualsVo = individualsResult.dataValues
                                            return userModel.create({
                                                    email: profile.emails[0].value,
                                                    user_type: constants.USER_INDIVIDUALS,
                                                    tb12_fkindividuals: individualsVo.idindividuals
                                                }, {
                                                    transaction: t
                                                })
                                                .catch(function (err) {
                                                    if (err)
                                                        throw err;
                                                })
                                                .then(function (userResult) {
                                                    var userVo = userResult.dataValues
                                                    console.log(typeof profile.id)
                                                    return sociaLoginModel.create({
                                                            idprovided: profile.id,
                                                            token: token,
                                                            logintype: constants.GOOGLE_LOGIN_TYPE,
                                                            tb11_fkuser: userVo.iduser
                                                        }, {
                                                            transaction: t
                                                        })
                                                        .then(function (sociaLoginResult) {
                                                            return userVo
                                                        })
                                                        .catch(function(err) {
                                                            if(err)
                                                                throw err;
                                                        })
                                                })
                                        }).catch(function(err) {
                                            if(err)
                                                throw err
                                        })
                                }
                            }).catch(function(err) {
                                if(err)
                                    throw err
                            })
                    }).then(function (result) {
                        return done(null, result);
                    }).catch(function (err) {
                        if (err) 
                            return done(err)
                    });
            })
        }))
};

此代码位于文件中,我将其用作app.js中的中间件调用:

require('./logins/google')(passport);

我也使用本地登录和facebook这样做,因为几乎与谷歌登录中的代码相同,为什么Sequelize正在执行那些查询?难道我做错了什么??我怎样才能最小化这个数字?感谢。

1 个答案:

答案 0 :(得分:4)

根据您的评论,我推断您的Express / Passport设置看起来与此类似:

app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(...));

因为Express按顺序调用中间件,这意味着每个请求在到达静态中间件之前首先会通过Passport中间件传递。

Passport中间件调用passport.deserializeUser(...),因此也会调用最终由静态中间件处理的请求(例如,CSS / JS / HTML文件)。

如果重新安排中间件订单,将首先针对这些特定请求调用静态中间件,并且只有当它无法处理请求时(例如,对于应由您的某个路由处理的请求),它才会通过对Passport中间件的请求:

app.use(express.static(...));
app.use(passport.initialize());
app.use(passport.session());