Meteor.loginWithFacebook不存储电子邮件地址

问题描述 投票:1回答:2

我正在使用

在服务器上:

ServiceConfiguration.configurations.remove({
    service: 'facebook'
});

ServiceConfiguration.configurations.upsert(
    { service: 'facebook' },
    { $set: {
        appId: 'xxxxxxxxxxxxxxxx',
        secret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
      }
    }
);

在客户端:

Meteor.loginWithFacebook({requestPermissions: ['email']}, function(error){
  if (error) {
    throwError('Could not log in');
  } else {
    // success
  }
});

此配置提示用户进行Facebook验证,可以访问电子邮件并且不会返回任何错误。新用户是具有正确名称和ID的商店。但是这封电子邮件不存储在用户对象中。

这是我从shell中获取用户时获得的。

{ _id: 'xxxxxxxxxxxxxxxxx',
  createdAt: Mon Jul 13 2015 13:36:21 GMT+0200 (CEST),
  services: 
   { facebook: 
      { accessToken: 'xxxxxxxxxxxxxxxxxxxxx...',
        expiresAt: 1441971380621,
        id: 'xxxxxxxxxxxxxxxxx',
        name: 'xxxx xxxxxx' },
     resume: { loginTokens: [Object] } },
  profile: { name: 'xxxx xxxxxx' } }

为什么Facebook的电子邮件地址没有存储?

javascript facebook meteor meteor-accounts
2个回答
2
投票

虽然我已经向Meteor报告了这个问题,但我暂时找到了一个快速解决方案。

在服务器上运行:

Accounts.onCreateUser(function(options, user) {
  if (user.hasOwnProperty('services') && user.services.hasOwnProperty('facebook')  ) {
    var fb = user.services.facebook;
    var result = Meteor.http.get('https://graph.facebook.com/v2.4/' + fb.id + '?access_token=' + fb.accessToken + '&fields=name,email');

    if (!result.error) {
      _.extend(user, {
        "emails": [{"address": result.data.email, "verified": false}],
        "profile": {"name": result.data.name}
      });
    }
  }

  return user;
});

[编辑]

以前的代码有效,但由于它导致其他登录方法出现问题,我采用了另一种方法:

在客户端,当用户使用Facebook进行身份验证时,我在服务器上调用一个函数:

Meteor.loginWithFacebook({requestPermissions: ['email']}, function(error){
  if (error) {
    //error
  } else {
    Meteor.call('fbAddEmail');
  }
});

然后在服务器上:

Meteor.startup(function () {
  Meteor.methods({
    fbAddEmail: function() {
      var user = Meteor.user();
      if (user.hasOwnProperty('services') && user.services.hasOwnProperty('facebook')  ) {
        var fb = user.services.facebook;
        var result = Meteor.http.get('https://graph.facebook.com/v2.4/' + fb.id + '?access_token=' + fb.accessToken + '&fields=name,email');

        if (!result.error) {
          Meteor.users.update({_id: user._id}, {
            $addToSet: { "emails": {
              'address': result.data.email,
              'verified': false
            }}
          });
        }
      }
    }
  });
});

0
投票

即使您要求“电子邮件”权限,Facebook API也可能无法返回某些用户的电子邮件地址。 official API docs说:

如果没有有效的电子邮件地址,则不会返回[email]字段。

其中一个原因可能是未经证实的电子邮件地址,另一个原因可能是仅使用手机号码注册的用户。

© www.soinside.com 2019 - 2024. All rights reserved.