Search code examples
feathersjspassport-facebookfeathers-authenticationfeathers-hook

How to read user info from passport-facebook


I have implemented the code to enable facebook authentication the following way:

const authentication = require('feathers-authentication');
const jwt = require('feathers-authentication-jwt');
const local = require('feathers-authentication-local');
const oauth2 = require('feathers-authentication-oauth2');
const GoogleStrategy = require('passport-google-oauth20');
const FacebookStrategy = require('passport-facebook');

module.exports = function () {
  const app = this;
  const config = app.get('authentication');


  // Set up authentication with the secret
  app.configure(authentication(config));
  app.configure(jwt());
  app.configure(local());

  app.configure(oauth2(Object.assign({
    name: 'google',
    Strategy: GoogleStrategy
  }, config.google)));

  app.configure(oauth2(Object.assign({
    name: 'facebook',
    Strategy: FacebookStrategy
  }, config.facebook)));

  // The `authentication` service is used to create a JWT.
  // The before `create` hook registers strategies that can be used
  // to create a new valid JWT (e.g. local or oauth2)
  app.service('authentication').hooks({
    before: {
      create: [
        authentication.hooks.authenticate(config.strategies),

        // modifying params.payload.
        hook => {
          // make sure params.payload exists
          hook.params.payload = hook.params.payload || {}
          // merge in a `test` property
          if(hook.params.user){
            Object.assign(hook.params.payload, {email: hook.params.user.email, name: hook.params.user.name});
          }
        }
      ],
      remove: [
        authentication.hooks.authenticate('jwt')
      ]
    }
  });
};

If I debug the code execution in node_modules/passport-facebook/lib/strategy.js I can see that all the user profile fields are retrieved (name, email, gender...) but I haven't figured out how to pass these values to hooks in order to store it into the database.

Does anyone know how to pass these values to authentication service/hooks in order to store them?


Solution

  • Have a look at the section on how to customize the oAuth response. You should get the profile information when creating or updating the user and be able to map it in a before hook for the users service:

    function customizeGithubProfile() {
      return function(hook) {
        console.log('Customizing Github Profile');
        // If there is a github field they signed up or
        // signed in with github so let's pull the primary account email.
        if (hook.data.github) {
          hook.data.email = hook.data.github.profile.emails.find(email => email.primary).value;
        }
    
        // If you want to do something whenever any OAuth
        // provider authentication occurs you can do this.
        if (hook.params.oauth) {
          // do something for all OAuth providers
        }
    
        if (hook.params.oauth.provider === 'github') {
          // do something specific to the github provider
        }
    
        return Promise.resolve(hook);
      };
    }
    
    
    app.service('users').hooks({
      before: {
        create: [customizeGithubProfile()],
        update: [customizeGithubProfile()]
      }
    });