Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

email is not returned #189

Open
ashnamuh opened this issue Dec 26, 2016 · 16 comments
Open

email is not returned #189

ashnamuh opened this issue Dec 26, 2016 · 16 comments

Comments

@ashnamuh
Copy link

ashnamuh commented Dec 26, 2016

Hi,

I'm using nodejs and expressjs with passport-facebook for user to signup account with fb account. I found a facebook user account is not returning the email. The user don't signed up with the Phone number instead. Only email is saved in the account contact. In addition, the email has been verified. I don't know what is problem. Anyone has an idea?

My strategy

passport.use(new FacebookStrategy({
  clientID: facebookConfig.clientID,
  clientSecret: facebookConfig.clientSecret,
  callbackURL: facebookConfig.callbackURL,
  profileFields: ['id', 'displayName', 'name', 'gender', 'profileUrl', 'emails', 'photos'] // also 'email' is not working
  },
  function facebookHandler(accessToken, refreshToken, profile, cb) {
    if (!profile.emails || !profile.emails[0].value || !profile._json.email) {
      throw new UnprocessableEntity('No Email in Facebook');
    }
    let email = profile.emails[0].value || profile._json.email;

    User.findOne({
      where: {externalId: profile.id}
    })
    ...
  }
));
@brnrc
Copy link

brnrc commented Jan 10, 2017

+1 here. Same issue.
Tried using 'email' and 'emails'. Nothing gets returned.

@rsnider19
Copy link

You need to do the following when authenticating: passport.authenticate('facebook', {scope: 'email'})
Then, in your FacebookStrategy, request profileFields: [...'email'...]

@orielbachar
Copy link

Hi, I am having the same issue. Please see my code below. Not being able to request additional permissions...
Any suggestions?

router.get('/auth/facebook', passport.authenticate('facebook', { scope: ['email']}));

passport.use(new FacebookStrategy({
clientID: /////
clientSecret: ////
callbackURL: "http://localhost:8000/auth/facebook/callback",
profileFields: ['id', 'email', 'displayName', 'photos']
},

@vvzen
Copy link

vvzen commented Feb 14, 2017

+1, requesting both in scope

passport.authenticate("facebook", {
   failureRedirect: "/login",
   scope: ["email"] ...

and profileFields:

profileFields: ['id', 'email', 'name'] ...

@vvzen
Copy link

vvzen commented Feb 15, 2017

After checking the official facebook APIs, it seems that passport is broken.. or there's something I don't get.

Here's a working url created by hand using the facebook docs (paste it in the browser adding your app id and you'll see the popup):

https://www.facebook.com/v2.8/dialog/oauth?client_id=your_app_id&redirect_uri=http://localhost:3000/auth/facebook/callback&scope=public_profile,email

screen shot 2017-02-15 at 20 14 11

And here's the url that passportjs generates (passing scope: ["public_profile", "email"] ) :

https://www.facebook.com/dialog/oauth?response_type=code&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fauth%2Ffacebook%2Fcallback&client_id=your_app_id

screen shot 2017-02-15 at 20 14 43

Clearly the scope doesn't get appended to the url, now we should investigate why and what's the right way to add scope to the request. .. maybe looking at the passport.authenticate() function in the source code could help?

@rsnider19 do you know something more?

@EyMaddis
Copy link

I used the following and it worked:

passport.use(new FacebookStrategy({
  clientId: ...,
  clientSecret: ...,
  callbackURL: ....,
  profileFields: ['id', 'displayName', 'email', 'first_name', 'middle_name', 'last_name']
}))

@fei115
Copy link

fei115 commented Mar 21, 2017

I tried the following, and it is still not working.

  1. add email to scope
    passport.authenticate('facebook', { scope : ['email', 'public_profile'], session : false }),

  2. add email to profileFields
    profileFields: ["id", "birthday", "email", "first_name", "last_name", "gender", "picture.width(200).height(200)"],

When I tried the Graph API V 2.7 with me?fields=id,name,email, email is also not returned.

@igorkokotko
Copy link

Try it

passport.use('facebook', new FacebookStrategy({
  clientID        : secret.facebook.clientID,
  clientSecret    : secret.facebook.clientSecret,
  callbackURL     : secret.facebook.callback,
  profileFields   : secret.facebook.profileFields
},

@jorrit
Copy link

jorrit commented May 20, 2017

For me this happens when users have restricted the visibility of their email address to only themselves.

@prdk0
Copy link

prdk0 commented Oct 6, 2018

@rsnider19 , Thanks man your solution worked.

@amitfegade121
Copy link

@rsnider19 Thanks man... Your solution works..... Guys go for it.....

@MBerka
Copy link

MBerka commented Mar 18, 2020

The provided solutions (email in bot scope and in profileFields) work, and produce an object that looks just like the GoogleStrategy's. Any problems with the scope term missing from the URL (vyzen's post) appear resolved; it looked normal to me even when I was using the wrong scope strings. Recommend close.

@poode
Copy link

poode commented Mar 22, 2020

You can use specified strings in this URL https://developers.facebook.com/docs/facebook-login/permissions#reference-default

Below is a snippet for strategy configuration

const { Strategy } = require('passport-facebook');
const FacebookStrategy = Strategy;

exports.facebookStrategy = new FacebookStrategy(
  {
    clientID: process.env.FACEBOOK_CLIENT_ID,
    clientSecret: process.env.FACEBOOK_CLIENT_SECRET,
    callbackURL: process.env.FACEBOOK_CALLBACK_URL,
    profileFields: [
      'email',
      'name',
      'displayName',
      'picture' ,
      'name_format',
      'short_name',
    ]
  },
  function(accessToken, refreshToken, profile, done) {
    done(null, profile);
  }
)

@robertoosantos
Copy link

I'm facing the same and I guess when it happens is something related to the following documentation and not passport it self:

email | string | The User's primary email address listed on their profile. This field will not be returned if no valid email address is available.
Facebook Graph API User

I've just implemented this as an alternative:

      const { email, first_name, last_name, id} = profile._json;
      const userData = {
        email: email || id, // If there's no e-mail, uses user's Facebook id
        nome: `${first_name} ${last_name}`,
      };

I don't like it. But I hope it works.

@shubhamdixit863
Copy link

I used the following and it worked:

passport.use(new FacebookStrategy({
  clientId: ...,
  clientSecret: ...,
  callbackURL: ....,
  profileFields: ['id', 'displayName', 'email', 'first_name', 'middle_name', 'last_name']
}))

Works for me

@abid211051
Copy link

abid211051 commented Feb 21, 2024

May be you didn't added email in permision section of your meta developer console app.

Inside Meta developer console > go to your App > go to "Use Cases" > go to "Authentication and account creation customization "> in customiztion check the below "permisssion" section if email is added or not?
meta

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests