【问题标题】:facebook api not returning emailfacebook api不返回电子邮件
【发布时间】:2015-10-18 01:42:47
【问题描述】:

我正在尝试使用 facebook api 返回用户电子邮件地址。前几天还好好的,今天就停了,不知道是什么原因。

首先我得到访问令牌:

FB.login(response => {
    if (response.authResponse) {
      resolve(response.authResponse.accessToken);
    } else {
      reject({
        error: 'User cancelled login or did not fully authorize.'
      });
    }
  }, {
    scope: 'public_profile,email'
  });

然后我尝试获取用户数据

FB.api('/me', {fields: 'first_name,last_name,email'}, function(response) {
  console.log(response);
});

但我只获取 first_name 和 last_name 的数据。没有电子邮件。

此外,当我请求权限时,它会给我电子邮件,但正如我所说,电子邮件不会被退回。

FB.api('/me/permissions', function(response) {
  console.log(response);
});

有谁知道可能是什么问题?

顺便说一句:我正在使用 API v2.4。

【问题讨论】:

  • 首先在 Graph API Explorer 中尝试请求,使用您的应用程序 ID 和您的 JS 使用的相同访问令牌(应该包含在 response 对象中,因此将其记录到控制台并从中复制并粘贴那里。)此外,请确保用户在其帐户中设置了有效的电子邮件地址,并且已通过验证。
  • 这种情况发生在您的所有用户身上,还是只发生在一个或几个用户身上?就像 CBroe 提到的那样;可能是有人从他们的个人资料中删除了他们的电子邮件。

标签: facebook facebook-graph-api facebook-javascript-sdk


【解决方案1】:
FB.api('/me?fields=email,name', function(response) { /* stuff here */ });

尝试将您的退货字段添加到您的请求中。

【讨论】:

  • 不是这样,推荐的方法是一个附加参数:developers.facebook.com/docs/javascript/reference/FB.api - 而且,他得到了其他字段,只有电子邮件丢失。
  • 是的,请肯定电子邮件缺少任何解决方案
  • 这个解决方案对我有用,将字段作为参数传递是不一致的。
  • 我也必须这样做。我指定了正确的范围,但裸露的“/me”默认只返回 id,name。
  • 2020年,我也不得不这样做。 Facebook 文档很狡猾,fb 不会费心确保它按照记录的方式工作,或者在所有文档中都不一致。
【解决方案2】:

我知道这是个老问题,但是如果有人仍在寻找答案,那么以下解决方法对我有用。

您需要在scope="public_profile,email" 范围内添加电子邮件。

<fb:login-button  scope="public_profile,email" autologoutlink="false" onlogin="OnRequestPermission();"></fb:login-button>

【讨论】:

    【解决方案3】:

    一个可能的原因是用户没有验证电子邮件。尝试与其他用户一起使用经过验证的电子邮件,以确保这不是问题。

    另见this answer

    【讨论】:

    • 这就是我的原因。感谢您指出这一点:)
    【解决方案4】:

    如果您正确设置了所有代码,但仍然没有收到来自 API 的电子邮件。用户可能没有绑定邮箱或者用户未确认邮箱。

    【讨论】:

      【解决方案5】:

      我使用承诺使其工作,并将 {scope:'email'} 添加到初始请求中,然后在 fb.api 字段中包含 'email'。

      fb.login({scope:'email'}).then(function (resp) {
          if (resp.status === 'connected') {
             fb.api('/me', 'get', {fields:'id,email,first_name,gender,...'}).then(function (FbUserData) {
                console.log(FbUserData);
             });
          }
      });
      

      【讨论】:

      • 我不怀疑它有效,但这是否记录在 developers.facebook.com 的任何地方?
      【解决方案6】:

      我花了很多时间试图弄清楚为什么 FacebookLoginASPnetWebForms Asp.Net 应用程序 (https://github.com/nickpinheiro/FacebookLoginASPnetWebForms) 上没有返回电子邮件。

      感谢 N Nem 上面的帖子(谢谢!)。

      打开 Default.aspx.cs

      在 HyperLink1.NaviagteUrl 中,添加查询字符串参数:&scope=public_profile,email

      HyperLink1.NavigateUrl = "https://www.facebook.com/v2.4/dialog/oauth/?client_id=" + ConfigurationManager.AppSettings["FacebookAppId"] + "&redirect_uri=http://" + Request.ServerVariables["SERVER_NAME"] + ":" + Request.ServerVariables["SERVER_PORT"] + "/account/user.aspx&response_type=code&state=1&scope=public_profile,email";
      

      我还必须修复一些错误才能正确解析访问令牌。

      这一次,邮箱地址可用!我希望这会有所帮助?

      【讨论】:

        【解决方案7】:

        上面的 N Nem 为我固定。代码正确,但缺少登录按钮上的范围。我使用的代码如下。

        function statusChangeCallback(response){
            if(response.status === 'connected'){
                registerUser(response);
            }
        }
        
        function checkLoginState() {
          FB.getLoginStatus(function(response) {
                statusChangeCallback(response);
          });
        }
        
        function registerUser(statusResponse){
            let userId = statusResponse.authResponse.userID;
            FB.api('/'+userId+'/?fields=id,email,first_name,last_name',function(response){
                if(response && !response.error){
                    console.log(response);
                }
            });
        }
        

        【讨论】:

          【解决方案8】:

          这篇文章有点老了,但我正在分享对我有用的解决方案。

          FB登录SDK版本:v6.0

          首先,确保用户(即您用于测试目的)拥有有效/经过验证的电子邮件。参考下面的代码。

          FB.login(response => {
              // your code
          }, {
              scope: 'public_profile,email',
              return_scopes: true,
              auth_type: 'rerequest'
          });
          

          在获取用户详细信息时

          const response = await axios({
                method: 'get',
                url: 'https://graph.facebook.com/v6.0/me?fields=id,name,email&access_token=ACCESS_TOKEN&pretty=0&sdk=joey&suppress_http_code=1'
          

          });

          我添加了参数 fields=id,name,email

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-09-29
            • 1970-01-01
            • 2013-08-25
            • 2013-05-13
            • 1970-01-01
            • 1970-01-01
            • 2012-12-10
            • 2017-11-16
            相关资源
            最近更新 更多