2017-02-11 8 views
1

Я учусь добавить социальную аутентификацию с Facebook в приложение. Все работает нормально, пока я не попытаюсь войти в свое тестовое приложение с Facebook. Вместо того, чтобы быть направлены на страницу профиля, я получаю эту ошибку:Проверка подлинности Facebook с паспортом. Не удается прочитать свойство «0» неопределенной ошибки

Cannot read property '0' of undefined 

TypeError: Cannot read property '0' of undefined 
    at Strategy.generateOrFindUser [as _verify] (C:\projects\Side   Projects\passyapp\app.js:16:19) 
    at C:\projects\Side Projects\passyapp\node_modules\passport- oauth2\lib\strategy.js:193:24 
    at C:\projects\Side Projects\passyapp\node_modules\passport- github\lib\strategy.js:174:7 
    at passBackControl (C:\projects\Side Projects\passyapp\node_modules\oauth\lib\oauth2.js:134:9) 
    at IncomingMessage.<anonymous> (C:\projects\Side Projects\passyapp\node_modules\oauth\lib\oauth2.js:157:7) 
    at emitNone (events.js:91:20) 
    at IncomingMessage.emit (events.js:185:7) 
    at endReadableNT (_stream_readable.js:974:12) 
    at _combinedTickCallback (internal/process/next_tick.js:74:11) 
    at process._tickCallback (internal/process/next_tick.js:98:9) 

НИЖЕ отрывок из МОЕГО APP.JS ФАЙЛА:

function generateOrFindUser(accessToken, refreshToken, profile, done){ 
    if(profile.emails[0]) { 
    User.findOneAndUpdate(
     { email: profile.emails[0] }, 
     { 
     name: profile.displayName || profile.username, 
     email: profile.emails[0].value, 
     photo: profile.photos[0].value 
     }, 
     { 
     upsert: true 
     }, 
    done 
); 
    } else { 
    var noEmailError = new Error("Your email privacy settings prevent you from signing in."); 
    done(noEmailError, null); 
    } 
} 

passport.use(new FacebookStrategy({ 
    clientID: process.env.FACEBOOK_APP_ID, 
    clientSecret: process.env.FACEBOOK_APP_SECRET, 
    callbackURL: "http://localhost:3000/auth/facebook/return", 
    profileFields: ['email', 'id', 'displayName', 'photos'] 
}, 
    generateOrFindUser) 
); 


//in order for passport to handle sessions you need to implement the two methods 
//directly below 
passport.serializeUser(function(user, done) { 
    done(null, user._id); 
}); 

passport.deserializeUser(function(userId, done) { 
    User.findById(userId, function(err, done) { 
    //done(err, user); 
    }); 
}); 

Это моя схема пользователя

var UserSchema = new mongoose.Schema({ 
    email: { 
    type: String, 
    required: true, 
    trim: true, 
    unique: true, 
    }, 
    name: { 
    type: String, 
    required: true, 
    trim: true, 
    }, 
    favoriteBook: { 
    type: String, 
    required: false, 
    trim: true 
    }, 
    photo: { 
    type: String, 
    required: true, 
    trim: true 
    } 
}); 

Надеюсь, это не пустая трата времени занятого кодера. Любая попытка помочь получает высокую оценку.

+0

'profile.emails' подразумевает, что вы запросили область' emails', а не 'email' – hjpotter92

ответ

1

EDIT: лучше ответ

Я предполагаю, что это profile.emails объект (не могу сказать, на основе номера строки, потому что ваш код сниппет). Перед этой функцией вы должны иметь код, который выглядит так.

Вы должны обеспечить две вещи:

1. При вызове passport.authenticate, убедитесь, чтобы запросить объем электронной почты, например: app.route('/auth/facebook').get(passport.authenticate('facebook', { scope: ['email']}));

2.

passport.use(new FacebookStrategy({ 
    clientID: facebookConfig.clientID, 
    clientSecret: facebookConfig.clientSecret, 
    callbackURL: facebookConfig.callbackURL, 
    profileFields : ['id', 'name', 'email'], 
    }, 
    function generateOrFindUser... 

Важно, чтобы массив profileFields содержал email.

+0

Спасибо за ответ. Я уже запросил область электронной почты, как вы предполагали, к сожалению, по-прежнему имеет ту же ошибку. –

+0

было моим предположением, что 'profile.emails' не определено правильно? –

+0

Подождите ... почему он говорит паспорт-гитхуб в вашей трассе? у вас есть строка, в которой говорится: «var FacebookStrategy = require (« паспорт-github »). Стратегия;'? –