Facebook OAuth Stuck

时间:2016-11-07 19:12:23

标签: javascript node.js facebook oauth passport.js

我现在一直试图解决这个问题,但我无法找到错误。我已经在客户端使用JavaScript了一段时间,并开始编写一本书。不幸的是,facebook似乎已经改变了他们的oauth方法(例如用户名似乎已被弃用)。所以我的问题是这个。如果我还没有登录到Facebook,我会被重定向到fb。我登录,但卡在其网站上。 但是,如果我被锁定,我的浏览器只会继续加载一两分钟,然后告诉我已经使用了auth密钥。我希望也许你可以帮助我。我的环境文件看起来像这样

(development.js)

module.exports = {
//Development configuration options
db              : 'mongodb://localhost/mean-book',
sessionSecret   : 'developmentSessionSecret',
facebook        : {
    clientId        : '*************',
    clientSecret    : '************************',
    callbackURL     : 'http://localhost:3000/oauth/facebook/callback'
}
};

在developers.facebook页面上,我已将我的应用程序域设置为localhost,并将站点URL设置为http://localhost:3000/oauth/facebook/callback。我在那里尝试了很多变化。迄今没有任何帮助。这就是我的策略

facebook.js

var passport        = require('passport'),
url             = require('url'),
FacebookStrategy = require('passport-facebook').Strategy,
config          = require('../config'),
users           = require('../../app/controllers/users.server.controller');

module.exports = function(){
    passport.use(new FacebookStrategy({
        clientID            : config.facebook.clientId,
        clientSecret        : config.facebook.clientSecret,
        callbackURL         : config.facebook.callbackURL,
        profileFields       : ['id','email', 'name', 'displayName', 'gender', 'profileUrl'],
        passReqToCallback   : true
    },
    function(req, accessToken, refreshToken, profile, done){
        var providerData            = profile._json;
        providerData.accessToken    = accessToken;
        providerData.refreshToken   = refreshToken;
        console.log('------PROFILE-----');
        console.log(profile);
        console.log('------END PROFILE-------')
        var providerUserProfile     =  {
            firstName   : profile.name.givenName,
            lastName    : profile.name.familyName,
            fullName    : profile.displayName,
            username    : profile.id,
            email       : profile.emails[0].value,
            provider    : 'facebook',
            providerId  : profile.id,
            providerData: providerData
        };
        console.log('---------------');
        console.log(providerUserProfile);
        console.log('---------------')
        users.saveOAuthUserProfile(req, providerUserProfile, done);
    }));
};

我的护照配置看起来像这样

(passport.js)

var passport    = require('passport'),
    mongoose    = require('mongoose');

    module.exports = function(){
        var User = mongoose.model('User');

        passport.serializeUser(function(user, done){
            done(null, user.id);
        });

        passport.deserializeUser(function(id, done){
            User.findOne({
                _id: id
            }, '-password -salt', function(err, user){
                done(err, user);
            });
        });

        require('./strategies/local.js')();
        require('./strategies/facebook.js')();
    };

最后我的路线使用这种方法

exports.saveOAuthUserProfile = function(req, profile, done){
    User.findOne({
        provider    : profile.provider,
        providerId  : profile.providerId 
    }, function(err, user){
        if(err){
            return done(err);
        } else {
            if(!user){
                var possibleUsername = profile.username || ((profile.email) ? profile.email.split('@')[0] : '');
            }
        }
    });
}

首先感谢您通过所有这些代码来帮助。我真的很感激,因为我很失落。再次感谢,

问候克里斯

1 个答案:

答案 0 :(得分:0)

如果fb用户成功授权,您错过了致电done的功能

exports.saveOAuthUserProfile = function(req, profile, done){
    User.findOne({
        provider    : profile.provider,
        providerId  : profile.providerId 
    }, function(err, user){
        if(err){
            return done(err);
        } else {
            if(!user){
                user.possibleUsername = profile.username || ((profile.email) ? profile.email.split('@')[0] : '');
            }
            done(null, user);
        }
    });
}