【问题标题】:Facebook OAuth StuckFacebook OAuth 卡住了
【发布时间】:2017-03-21 05:54:17
【问题描述】:

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

(开发.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] : '');
            }
        }
    });
}

首先感谢您通过所有这些代码提供帮助。我真的很感激,因为我在这里迷路了。再次感谢和

问候克里斯

【问题讨论】:

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


    【解决方案1】:

    如果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);
            }
        });
    }
    

    【讨论】:

    • 是的。也发现了,正要贴出来。有时答案可能很简单:)。非常感谢
    猜你喜欢
    • 2018-12-03
    • 1970-01-01
    • 2012-06-23
    • 2021-10-08
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多