【问题标题】:Facebook Passport Strategy returning 500 errorFacebook Passport 策略返回 500 错误
【发布时间】:2017-07-13 13:00:28
【问题描述】:

我正在尝试让 登录登录 用户使用 passport.js facebook 策略将他们的帐户与 facebook 连接,并根据userSchema(在user.jsmodel 中制作,如下所示。

我尝试了很多组合,但仍然从 facebook 收到 500error,或者如果显示 facebook auth,facebook 无法返回(代码组合,我尝试过)并保存对象。

PS我在 facebook 中输入了正确的回调 URL

PPS:请参考下面我的更新routes.js和更新passport.js

这是我的routes.js 文件:

    app.get('/auth/connect/facebook', passport.authenticate('facebook-connect', { authType: 'rerequest', scope: ['id', 'cover', 'gender', 'photos'] }));

app.get('/auth/connect/facebook/callback',
    passport.authenticate('facebook-connect', {
        successRedirect: '/profile/configure',
        failureRedirect: '/profile/congigure'
            // failureFlash: true
    }));

我的passport.js facebook-connect 文件:

passport.use('facebook-connect', new FacebookStrategy({
        clientID: configAuth.facebookAuth.clientID,
        clientSecret: configAuth.facebookAuth.clientSecret,
        callbackURL: configAuth.facebookAuth.callbackURL,
        profileFields: ['id', 'cover', 'gender', 'photos'],
        enableProof: true
    },
    function(token, refreshToken, profile, cb) {
        process.nextTick(function() {
            User.findOne({ 'local.facebook.id': profile.id }, function(err, user) {
                if (err)
                    return cb(err);

                if (user) {
                    return cb(null, false, req.flash('fbflash', 'This facebook user is already connected with an account at eBird.'));
                } else {

                    user.local.facebook.id = profile.id;
                    user.local.facebook.token = token;
                    user.local.profile.gender = profile.gender;
                    user.local.profile.herobg = profile.cover;
                    user.local.profile.dp = user.local.profile.dp ? user.local.profile.dp : profile.photos[0].value;
                    if (user.local.profile.dp == '') {
                        if (user.local.profile.gender == 'male') {
                            user.local.profile.dp = 'http://res.cloudinary.com/pinterested222/image/upload/v1487659283/an-av-3_jxrhwc.png';
                        }
                        if (user.local.profile.gender == 'female') {
                            user.local.profile.dp = 'http://res.cloudinary.com/pinterested222/image/upload/v1487770814/female-avatar_vvyvtj.png';
                        }
                    }

                    user.save(function(err) {
                        if (err)
                            throw err;
                        return cb(null, user);
                    });

                }
            });
        });
    }));

我的user.js 模特:

var mongoose = require('mongoose');
var bcrypt = require('bcrypt-nodejs');
var DateOnly = require('mongoose-dateonly')(mongoose);
var shortid = require('shortid');
var uniqueValidator = require('mongoose-unique-validator');

var userSchema = mongoose.Schema({
    _id: {
        type: String,
        default: shortid.generate
    },
    local: {
        email: String,
        username: { type: String, unique: true },
        firstname: String,
        surname: String,
        name: String,
        role: { type: String, default: 'user' },
        department: String,
        pno: Number,
        password: String,
        verified: { type: Boolean, default: false },
        profile: {
            dp: String,
            createdAt: { type: Date, default: Date.now },
            herobg: String,
            location: String,
            website: String,
            gender: String,
            birthday: DateOnly,
            lastlogin: { type: Date },
            notifications: {
                name: String,
                namedp: String,
                type: { type: String },
                date: { type: Date, default: Date.now },
                read: { type: Boolean, default: false }
            }
        },
        facebook: {
            id: String,
            token: String
        }
    }
});

userSchema.plugin(uniqueValidator, { message: '{Path}:{VALUE} is already taken.' });

userSchema.methods.generateHash = function(password) {
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};

userSchema.methods.validPassword = function(password) {
    return bcrypt.compareSync(password, this.local.password);
};

// userSchema.methods.bellTimesAgo = function(date);

module.exports = mongoose.model('User', userSchema);

错误,它把我扔了:

The www.facebook.com page isn’t working

www.facebook.com is currently unable to handle this request.
HTTP ERROR 500

任何帮助将不胜感激, 谢谢。


更新 - 1

read (& 来自 passportjs docs) 关于 passport.authorize() 并将我的 passport.js 文件更新为 passport.authorize() 并更新了我的路线,但仍然是同样的问题。

这是我更新的passport.js

// Facebook Strategy Updated using authorize

passport.use(new FacebookStrategy({
        clientID: configAuth.facebookAuth.clientID,
        clientSecret: configAuth.facebookAuth.clientSecret,
        callbackURL: configAuth.facebookAuth.callbackURL,
        // profileFields: ['id', 'cover', 'gender', 'photos'],
        // enableProof: true,
        passReqToCallback: true
    },
    function(req, accessToken, refreshToken, profile, done) {
        process.nextTick(function() {

            if (!req.user) {
                User.findOne({ 'local.facebook.id': profile.id }, function(err, user) {
                    if (err)
                        return done(err);

                    if (user) {
                        return done(null, false, req.flash('fbflash', 'This facebook user is already connected with an account at eBird.'));
                    } else {

                        user.local.facebook.id = profile.id;
                        user.local.facebook.token = accessToken;
                        user.local.profile.gender = profile.gender;
                        user.local.profile.herobg = profile.cover;
                        user.local.profile.dp = user.local.profile.dp ? user.local.profile.dp : profile.photos[0].value;
                        if (user.local.profile.dp == '') {
                            if (user.local.profile.gender == 'male') {
                                user.local.profile.dp = 'http://res.cloudinary.com/pinterested222/image/upload/v1487659283/an-av-3_jxrhwc.png';
                            }
                            if (user.local.profile.gender == 'female') {
                                user.local.profile.dp = 'http://res.cloudinary.com/pinterested222/image/upload/v1487770814/female-avatar_vvyvtj.png';
                            }
                        }

                        user.save(function(err) {
                            if (err)
                                throw err;
                            return done(null, user);
                        });

                    }
                });

            } else {
                var user = req.user;
                user.local.facebook.id = profile.id;
                user.local.facebook.token = accessToken;
                user.local.profile.gender = profile.gender;
                user.local.profile.herobg = profile.cover;
                user.local.profile.dp = user.local.profile.dp ? user.local.profile.dp : profile.photos[0].value;
                if (user.local.profile.dp == '') {
                    if (user.local.profile.gender == 'male') {
                        user.local.profile.dp = 'http://res.cloudinary.com/pinterested222/image/upload/v1487659283/an-av-3_jxrhwc.png';
                    }
                    if (user.local.profile.gender == 'female') {
                        user.local.profile.dp = 'http://res.cloudinary.com/pinterested222/image/upload/v1487770814/female-avatar_vvyvtj.png';
                    }
                }

                user.save(function(err) {
                    if (err)
                        throw err;
                    return done(null, user);
                });
            }
        });
    }));

这是我更新的routes.js

app.get('/auth/connect/facebook', passport.authorize('facebook', { authType: 'rerequest', scope: ['id', 'cover', 'gender', 'photos'] }));

app.get('/auth/connect/facebook/callback',
    passport.authorize('facebook', {
        successRedirect: '/profile/configure',
        failureRedirect: '/profile/configure'
            // failureFlash: true
    })
);

这是我在 Facebook 上的应用回调设置快照

错误快照,facebook 不断抛出:

【问题讨论】:

  • facebook-connectpassport.authenticate 中的策略是否正确?我在任何文档中都找不到这样的。如果你使用passport-facebook 应该有passport.authenticate('facebook', ...)
  • @AntonNovik 我更新了我的设置,现在使用passport.authorize('facebook') 并更新了我的passport.js 文件,仍然没有帮助。

标签: node.js facebook-graph-api express mongoose passport-facebook


【解决方案1】:

Passport.js documentation 说:

scope 选项的值是特定于提供商的。有关受支持范围的详细信息,请参阅提供商的文档。

如果您在Facebook documentation 中检查允许的权限,您将找不到像'id', 'cover', 'gender', 'photos' 这样的权限。这些项目是某人public profile 的一部分。

因此,您应该将scope 中的routes.js 更改为:

scope: ['id', 'cover', 'gender', 'photos']

到:

scope: ['public_profile']

或者不指定范围,因为public_profile 是默认的 facebook 权限。

P.S.我告诉过你的“更新 1”代码版本。

【讨论】:

  • 谢谢!删除范围对象很平静,我已经添加了对我有用的答案!
【解决方案2】:

从@anton-novik 获得灵感,我修复了这个错误。

问题出在我的routes.js 文件中。先看看我上面的routes.js文件,然后按照下面的代码:

app.get('/auth/connect/facebook', ensureLoggedIn('/login'), passport.authorize('facebook', { authType: 'rerequest' }));

app.get('/auth/connect/facebook/callback',
    passport.authenticate('facebook', {
        successRedirect: '/profile',
        failureRedirect: '/profile/settings',
        failureFlash: true
    })
);

不需要scope,因为我提出的请求已经被 Facebook 批准用于每个应用程序。

然后将我的passport.js 文件更新为如下所示:

// // Facebook 策略

passport.use(new FacebookStrategy({
        clientID: configAuth.facebookAuth.clientID,
        clientSecret: configAuth.facebookAuth.clientSecret,
        profileFields: ['id', 'picture.type(large)', 'gender', 'cover'],
        callbackURL: configAuth.facebookAuth.callbackURL,
        passReqToCallback: true
    },
    function(req, accessToken, refreshToken, profile, done) {
        process.nextTick(function() {
            // User is not logged in yet
            if (!req.user) {
                User.findOne({ 'local.facebook.id': profile.id }, function(err, user) {
                    if (err)
                        return done(err);
                    if (user) {
                        if (!user.facebook.token) {
                            user.facebook.token = accessToken;
                            user.facebook.name = profile.displayName;
                            user.facebook.email = profile.emails[0].value;
                            user.save(function(err) {
                                if (err) throw err;
                                return done(null, user);
                            });
                        }
                        return done(null, user);
                    } else {
                        // User should be created here
                        //  and saved to mongoose
                    }
                });
            }
            //else user is logged in and needs to be merged
            else {
                console.log(profile); //display the returned json from fb
                // Connect the user and save the details, since the user already exsists
                var user = req.user;
                user.local.facebook.id = profile.id;
                user.local.facebook.token = accessToken;
                user.local.profile.gender = profile.gender;
                user.local.profile.dp = profile.photos[0].value;
                user.local.profile.herobg = profile._json.cover.source;

                user.save(function(err) {
                    if (err)
                        throw err;
                    return done(null, user);
                });
            }
        });
    }));

希望,它可以帮助某人。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2020-01-31
    • 2021-06-21
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多