Passport-Facebook not providing email even if it is in scope

后端 未结 3 2031
旧时难觅i
旧时难觅i 2021-02-04 03:09

In my application i register the facebook-strategie as follows: But the returned profile does not contain the email-field....

passport.use(new FacebookStrategy({         


        
相关标签:
3条回答
  • 2021-02-04 03:37

    You do have the callback part of the code, right?:

    app.get('/oauth/facebook/callback', passport.authenticate('facebook', {
        failureRedirect: '/login',
        successRedirect: '/',
        scope:['email']
    }));
    

    And, yes, indeed, this should be done with the scope:['email'], as per instructions from your link and this one here also.

    0 讨论(0)
  • 2021-02-04 03:40

    You need to specify the scope: "email". Refer the below code.

    Facebook authentication route:

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

    and while configuring the FacebookStrategy, you need to also specify the profileFields.

    passport.use(new FacebookStrategy({
      callbackURL: "http://localhost:5000/auth/facebook/redirect",
      clientID: keys.facebook.clientID,
      clientSecret: keys.facebook.clientSecret,
      profileFields: ['id', 'displayName', 'photos', 'email', 'gender', 'name']
    }, (accessToken, refreshToken, profile, done) => {
       // logic 
    }))
    
    0 讨论(0)
  • 2021-02-04 03:57

    From Facebook graph APIv2.4, we need to explicitly specify fields to get.

    Introducing Graph API v2.4

    So, we can write like:

      passport.use(new FacebookStrategy({
          clientID: config.facebook.clientID,
          clientSecret: config.facebook.clientSecret,
          callbackURL: config.facebook.callbackURL,
          profileFields: ['id', 'email', 'gender', 'link', 'locale', 'name', 'timezone', 'updated_time', 'verified'],
        },
    
    0 讨论(0)
提交回复
热议问题