护照-Facebook无法获取电子邮件

14

我已经使用expressjs和passport-Facebook在我的网站中实现了Facebook登录。它运行良好(我获取了个人资料字段),但问题是我无法获取电子邮件。我收到了一个错误:

email   : profile.emails[0].value,

类型错误: 无法读取未定义的属性 '0'

我的代码:

passport.use('facebook',new FacebookStrategy({
        clientID            : config.facebook.id,
        clientSecret    : config.facebook.secret,
        callbackURL  : '/auth/facebook/callback',
        profileFields : ['id', 'displayName', 'emails','photos']
    }, function(accessToken, refreshToken, profile, done) {

        User.findOne({provider_id: profile.id}, function(err, user) {
            if(err) throw(err);
            if(!err && user!= null) return done(null, user);

            var user = new User({
                provider_id : profile.id,
                name                 : profile.displayName,
                email               : profile.emails[0].value,
                photo               : profile.photos[0].value,
            });
            user.save(function(err) {
                if(err) throw err;
                return done(null, user);
            });
        });
    }));

希望有人能够帮助我解决我的问题:)


我现在尝试了一下。个人资料中没有电子邮件... - jcabello
如果您不使用profileFields参数会发生什么? - soulcheck
我有更多的信息,但没有电子邮件。 - jcabello
用户的电子邮件可能还没有经过验证? - soulcheck
5
或许这个问题可以帮到您。 - soulcheck
显示剩余4条评论
3个回答

12

我遇到了同样的问题。我们有10个测试用户,所有10个用户都有与他们的Facebook帐户关联的电子邮件地址。但是对于其中一个测试人员,Facebook没有在配置文件响应中返回“电子邮件”JSON属性。我不知道为什么,因为它看起来与其他正常工作的Facebook配置文件完全相同。

解决方法是更改此行:

passport.authenticate('facebook')

变成这样:

passport.authenticate('facebook', { scope: [ 'email' ] })

我仍然无法解释为什么这对于十分之九有效,但对于一个人无效。不管怎样,现在已经修好了 :-)


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Alex York
有同样的问题,这个帮助了: https://dev59.com/LWIj5IYBdhLWcg3waEf8 - kaxi1993
请让那个测试人员从他的Facebook账户中移除此应用,然后再尝试一次。这样就可以正常工作了。 - Arun Tyagi

1
尝试这个passport.authenticate('facebook', { scope: [ 'email' ] }) 还要在facebookStrategy中添加一个新字段profileFields: [ 'email' , 'name' ]

请写出更整洁、更易于社区理解的答案。 - Vinay Prajapati
感谢您的热心建议。由于我是StackOverflow的新手,对回答的方式不太熟悉。下次我会尽力而为。 - Ajay

0
  passport.use(new FacebookStrategy({
    clientID: config.facebook.clientID,
    clientSecret: config.facebook.clientSecret,
    callbackURL: config.facebook.callbackURL,
    passReqToCallback:true
  },

2
一个简短的答案解释对于OP会很有用。请提供原始文本以进行翻译。 - Manos Nikolaidis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接