jaredhanson / passport-facebook

Facebook authentication strategy for Passport and Node.js.
https://www.passportjs.org/packages/passport-facebook/?utm_source=github&utm_medium=referral&utm_campaign=passport-facebook&utm_content=about
MIT License
1.29k stars 447 forks source link

'ValidationError: “value” must be an object' #197

Open jacob-cross99 opened 7 years ago

jacob-cross99 commented 7 years ago

Hello, I am getting the following error: ValidationError: "value" must be an object at Object.exports.process (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\joi\lib\errors.js:140:17) at internals.Any.validate (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\joi\lib\any.js:667:25) at Object.module.exports [as sign] (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\jsonwebtoken\sign.js:93:47) at router.route.get (C:\Users\nsa\Desktop\QuickBucks\Server\lib\routes\oauth\index.js:13:9) at Layer.handle [as handle_request] (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\express\lib\router\layer.js:95:5) at next (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\express\lib\router\route.js:131:13) at complete (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\passport\lib\middleware\authenticate.js:250:13) at C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\passport\lib\middleware\authenticate.js:257:15 at pass (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\passport\lib\authenticator.js:421:14) at Authenticator.transformAuthInfo (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\passport\lib\authenticator.js:443:5) at C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\passport\lib\middleware\authenticate.js:254:22 at C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\passport\lib\http\request.js:60:7 at pass (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\passport\lib\authenticator.js:267:43) at serialized (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\passport\lib\authenticator.js:276:7) at passport.serializeUser (C:\Users\nsa\Desktop\QuickBucks\Server\index.js:23:42) at pass (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\passport\lib\authenticator.js:284:9) at Authenticator.serializeUser (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\passport\lib\authenticator.js:289:5) at IncomingMessage.req.login.req.logIn (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\passport\lib\http\request.js:50:29) at Strategy.strategy.success (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\passport\lib\middleware\authenticate.js:235:13) at verified (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\passport-oauth2\lib\strategy.js:177:20) at database.query.spread (C:\Users\nsa\Desktop\QuickBucks\Server\lib\oauth\index.js:30:19) at tryCatcher (C:\Users\nsa\Desktop\QuickBucks\Server\node_modules\bluebird\js\release\util.js:16:23)

jacob-cross99 commented 7 years ago

lib/oauth/index.js contains.

'use strict';

var FacebookStrategy = require('passport-facebook');

var config = require('./../config');
var database = require('./../database');

module.exports = class Oauth {
  static get facebook() {
    return new FacebookStrategy({
        clientID: config.facebook.app_id,
        clientSecret: config.facebook.app_secret,
        callbackURL: 'http://localhost:3000/oauth/redirect',
        profileFields: ['id', 'displayName', 'gender', 'birthday', 'emails', 'location']
      }, (accessToken, refreshToken, profile, cb) => {
        database.query('SELECT * FROM `accounts` WHERE id=?', profile.id)
          .spread((rows) => {
            if(rows.length !== 0) {
              database.query('UPDATE `accounts` SET displayName=?,email=?,gender=?,birthday=?,city=?,region=?,access_token=? WHERE id=?', [
                profile.displayName,
                profile.emails[0].value,
                profile.gender,
                profile._json.birthday,
                profile._json.location.name.split(', ')[0],
                profile._json.location.name.split(', ')[1],
                accessToken,
                profile.id
              ])
                .spread(() => {
                  cb(null, {
                    id: profile.id,
                    displayName: profile.displayName,
                    email: profile.emails[0].value,
                    gender: profile.gender,
                    birthday: profile._json.birthday,
                    city: profile._json.location.name.split(', ')[0],
                    region: profile._json.location.name.split(', ')[1],
                    access_token: accessToken
                  });
                })
                .catch((err) => {
                  cb('An error occured within the database');
                });
            } else {
              database.query('INSERT INTO `accounts` SET ?', {
                id: profile.id,
                displayName: profile.displayName,
                email: profile.emails[0].value,
                gender: profile.gender,
                birthday: profile._json.birthday,
                city: profile._json.location.name.split(', ')[0],
                region: profile._json.location.name.split(', ')[1],
                access_token: accessToken
              })
                .spread(() => {
                  cb(null, {
                    id: profile.id,
                    displayName: profile.displayName,
                    email: profile.emails[0].value,
                    gender: profile.gender,
                    birthday: profile._json.birthday,
                    city: profile._json.location.name.split(', ')[0],
                    region: profile._json.location.name.split(', ')[1],
                    access_token: accessToken
                  });
                })
                .catch((err) => {
                  cb('An error occured within the database');
                });
            }
          })
          .catch((err) => {
            cb('An error occured within the database');
          });
      }
    );
  }
}

Line 30 is:


cb(null, {
                    id: profile.id,
                    displayName: profile.displayName,
                    email: profile.emails[0].value,
                    gender: profile.gender,
                    birthday: profile._json.birthday,
                    city: profile._json.location.name.split(', ')[0],
                    region: profile._json.location.name.split(', ')[1],
                    access_token: accessToken
                  });
ntsd commented 7 years ago

I have the same problem I think this module does not support new facebook API. I think profile is empty.Maybe Facebook change data format.