【问题标题】:Node.js Passport deserializing Users returns 20+ identical usersNode.js Passport 反序列化用户返回 20 多个相同的用户
【发布时间】:2012-09-25 21:27:46
【问题描述】:

似乎一切正常。对Parse.com 的请求检查用户是否存在并创建或检索用户。 我有两个主要问题。首先,当调用deserializeUser 函数时,它会返回20 个相同的用户,而findUser 函数应该返回这20 个用户。 另外,我无法访问req.user

    passport.serializeUser(function(user, done) {

            done(null, user.objectId);
    });

    passport.deserializeUser(function(uid, done) {

            console.log(uid)
            // This outputs the ObjectId 20 TIMES!! ??

            Parse.findUser(uid,function(error,user){

                done(null, user);
            })
    });

    // CONFIGURATION
    app.configure(function() {
            app.use(express.bodyParser()); //read
            app.use(express.cookieParser()); //read
        app.use(express.session({ secret: process.env.SESSION_SECRET || 'abcde' }));
        app.use(passport.initialize());
        app.use(passport.session());
            app.use(app.router);
            app.use(express.static(__dirname + '/static'))
    });

    passport.use(new FacebookStrategy({
            clientID: process.env.FACEBOOK_APP_ID || 'app_id',
            clientSecret: process.env.FACEBOOK_SECRET || 'fb_secret',
        callbackURL: "http://localhost:5000/auth/facebook/callback"
        },
        function(accessToken, refreshToken, profile, done) {

            process.nextTick(function() {
                    _parse.user(accessToken, profile,function(parseUser){
                        //this returns the user.....

                    return done(null, parseUser);
                    })
            })
        })
    )
    app.get('/auth/facebook',
        passport.authenticate('facebook',{scope:'email'}),
            function(req, res){
                // The request will be redirected to Facebook ....
    });

    app.get('/auth/facebook/callback',
        passport.authenticate('facebook', { failureRedirect: '/login' }),
            function(req, res) {

                    console.log(req.user)
                    // this works! ...
                res.redirect('/browse');
    });

    app.get('/browse',function(req,res){
            console.log(req.user)
            // this is works too ...

            res.render('browse.jade',{title:'Browse',classes:'browse'})
    })

    app.get('/logout', function(req, res){
        req.logout();
        res.redirect('/login');
    });

【问题讨论】:

  • 您使用的是什么 Parse 库?这看起来不像官方 Parse JavaScript SDK。
  • javascript SDK 是针对客户端的,我没有在服务器上尝试过,但我很确定它不起作用(如果我错了,请有人纠正我)...我'正在使用 this module 成功地从 Parse 返回用户。
  • 您没有使用 Parse.com parse.com/docs/downloads 提供的官方 JavaScript API 有什么特别的原因吗?
  • 我正在使用文档中的this node packageParse.getUser其实是Parse.findUser,不知道为什么我现在改了……我更新了。

标签: node.js facebook parse-platform passport.js


【解决方案1】:

我怀疑您正在加载一个包含 20 个不同资源的页面,并且每次调用都是针对其中一个资源的单个请求。

app.use(express.static(__dirname + '/static')) 中间件移动到中间件堆栈的顶部。由于这些资源是静态且公开的,因此无需解析正文、cookie 或加载会话。

【讨论】:

  • 谢谢!!!太棒了,它有效!那么,我到底在做什么呢?为什么顺序很重要?
  • 请求将按照它们列出的顺序通过中间件,直到其中一个发送响应。静态中间件立即响应,跳过任何动态行为,如身份验证。
  • 这不再适合我。在路线之前,我一直在底部有 passportjs,每次我请求我的一些资产时,它都会进行反序列化调用。其他人有同样的经历吗?
猜你喜欢
  • 2018-03-30
  • 2013-11-22
  • 2021-06-05
  • 2014-12-12
  • 2019-03-16
  • 1970-01-01
  • 2013-12-07
  • 2017-11-05
  • 2016-04-10
相关资源
最近更新 更多