user232343
user232343

Reputation: 2118

facebook api not returning email

I am trying to return user email address using facebook api. Few days ago it was working fine, but today stopped working, and don't know why.

So first I get access token:

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'
  });

then I try to get user data

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

but I only get data for first_name and last_name. There is no email.

Also when I ask for permissions, it gives me email as granted, but as I said, email is not returned.

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

Does anyone knows what can be the problem?

BTW: I am using API v2.4.

Upvotes: 7

Views: 16999

Answers (8)

Yauhen
Yauhen

Reputation: 469

If you set all code correctly and still don't get an email from API. The user probably doesn't have an email bound to the account or the email not confirmed by the user.

Upvotes: 2

Rye
Rye

Reputation: 485

This is kinda old post but I am sharing the solution that worked for me.

FB Login SDK version: v6.0

First, make sure that the user (which is you for testing purposes) has a valid/verified email. Refer to the code below.

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

And in getting the user details

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'

});

I've added the parameter fields=id,name,email

Upvotes: 0

AdamVanBuskirk
AdamVanBuskirk

Reputation: 519

N Nem above fixed for me. Had the code correct, but missing the scope on the login button. Code I use is below.

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);
        }
    });
}

Upvotes: 0

Conrad Du Toit
Conrad Du Toit

Reputation: 1

I spent a lot of time trying to figure out why the email is not returned on the FacebookLoginASPnetWebForms Asp.Net application (https://github.com/nickpinheiro/FacebookLoginASPnetWebForms).

I got it working, thanks to N Nem's post above (thanks!).

Open Default.aspx.cs

In HyperLink1.NaviagteUrl, add the query string parameter: &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";

I also had to fix some bugs to parse the access token correctly.

This time, the email address is available! I hope this helps?

Upvotes: 0

Pat M
Pat M

Reputation: 6036

I made it work using a promise and adding {scope:'email'} to the initial request then including 'email' in the fb.api fields.

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);
       });
    }
});

Upvotes: 0

Nabin  Nembang
Nabin Nembang

Reputation: 753

I know this is old question however if someone still seraching for answers then following workaround worked for me.

You need to add email in scope scope="public_profile,email".

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

Upvotes: 5

lex82
lex82

Reputation: 11297

A possible cause is that the user did not validate the email. Try with another user with validated email to make sure this is not the problem.

See also this answer

Upvotes: 4

stillatmylinux
stillatmylinux

Reputation: 1429

FB.api('/me?fields=email,name', function(response) { /* stuff here */ });

Try adding your return fields to your request.

Upvotes: 20

Related Questions