Facebook登录在用户个人资料中返回"未定义"字段,但不会返回电子邮件.MEANJs + Passport-facebook

Hyd*_*der 6 facebook login passport-facebook meanjs

我正在使用Meanjs.org样板和Facebook注册将我返回到注册页面.以下是我到目前为止所采取的步骤.

1)设置Facebook应用程序站点URL

HTTP://本地主机:3000 /

OAuth的回调URI

HTTP://本地主机:3000/auth /中的Facebook /回调

2)将APP_ID和APP_Secret放在Client_ID和Client_Secret中

    facebook: {
    clientID: process.env.FACEBOOK_ID || '*****',
    clientSecret: process.env.FACEBOOK_SECRET || '*****',
    callbackURL: 'http://localhost:3000/auth/facebook/callback',
    profileFields: ['id','emails', 'first_name', 'last_name', 'displayName', 'link', 'about_me', 'photos' ]
},
Run Code Online (Sandbox Code Playgroud)

3)代码如下

--Routes

// Setting the facebook oauth routes
app.route('/auth/facebook').get(passport.authenticate('facebook', {
    scope: ['email']
}));
app.route('/auth/facebook/callback').get(users.oauthCallback('facebook'));
Run Code Online (Sandbox Code Playgroud)

- oauthCallback函数,

    exports.oauthCallback = function(strategy) {
    return function(req, res, next) {
        passport.authenticate(strategy, function(err, user, redirectURL) {
            if (err || !user) {
                console.log('1' + err);
                //console.log(user);
                return res.redirect('/#!/signin');
            }
            req.login(user, function(err) {
                if (err) {
                    console.log('2' + err);
                    return res.redirect('/#!/signin');
                }

                return res.redirect(redirectURL || '/');
            });
        })(req, res, next);
    };
};
Run Code Online (Sandbox Code Playgroud)

- Passport-Facebook战略

module.exports = function() {
// Use facebook strategy
passport.use(new FacebookStrategy({
        clientID: config.facebook.clientID,
        clientSecret: config.facebook.clientSecret,
        callbackURL: config.facebook.callbackURL,
        passReqToCallback: true
    },
    function(req, accessToken, refreshToken, profile, done) {

        console.log('facebook Strategy Started');
        // Set the provider data and include tokens
        var providerData = profile._json;
        providerData.accessToken = accessToken;
        providerData.refreshToken = refreshToken;

    //  console.log(JSON.stringify(profile));
        console.log(profile);

    //  console.log(JSON.stringify(profile.name.givenName));

        // Create the user OAuth profile
        var providerUserProfile = {
            firstName: profile.name.givenName,
            lastName: profile.name.familyName,
            displayName: profile.displayName,
            email: profile.emails[0].value,
            username: profile.username,
            provider: 'facebook',
            providerIdentifierField: 'id',
            providerData: providerData
        };

        //console.log('provider' + providerUserProfile);
        // Save the user OAuth profile
        users.saveOAuthUserProfile(req, providerUserProfile, done);
    }
));
Run Code Online (Sandbox Code Playgroud)

};

4)调试

在oauthCallback函数下记录错误返回以下内容,

1TypeError:无法读取未定义的属性"0"

Facebook在Passport-Facebook模块中作为个人资料返回的内容如下,

{ id: 'Id_of_the_person', username: undefined, displayName: 'Full_name_of_person', name: { familyName: undefined, givenName: undefined, middleName: undefined }, gender: undefined, profileUrl: undefined, provider: 'facebook', _raw: '{"name":"Full_name_of_person","id":"Id_of_the_person"}', _json: { name: 'Id_of_the_person', id: 'Id_of_the_person', accessToken: 'access_token_value', refreshToken: undefined } }

Can anyone be kind to guide me about getting the correct user profile from Facebook including user email?

非常感谢.

Roc*_*uza 0

首先,profileFields字段不遵守便携式联系人约定- 您可以在此处找到passportjs 的约定。

其次,在您的示例中,删除“about_me”后,Facebook 注册不会返回任何错误。在删除“about_me”之前,我遇到了一个不同的错误:尝试访问节点类型(用户)上不存在的字段(about_me)

如果错误仍然存​​在,请参阅系列 5 个教程,当我在注册页面上使用社交网络帐户进行身份验证时,这些教程对我很有帮助。