2016-02-20 1 views
0

Я очень новичок в стеке MEAN, и это может показаться очень наивным или неправильным, но я хочу спросить, когда мы аутентифицируем использование паспорт facebook стратегии, используя следующий код:Использование паспорт-facebook без пользователя Mongoose (нет Монго в стеке MEAN)

var FacebookStrategy = require('passport-facebook').Strategy; 
var User = require('../models/user'); 
var fbConfig = require('../fb.js'); 

module.exports = function(passport) { 

passport.use('facebook', new FacebookStrategy({ 
    clientID  : fbConfig.appID, 
    clientSecret : fbConfig.appSecret, 
    callbackURL  : fbConfig.callbackUrl 
}, 

// facebook will send back the tokens and profile 
function(access_token, refresh_token, profile, done) { 

    console.log('profile', profile); 

    // asynchronous 
    process.nextTick(function() { 

     // find the user in the database based on their facebook id 
     User.findOne({ 'id' : profile.id }, function(err, user) { 

      // if there is an error, stop everything and return that 
      // ie an error connecting to the database 
      if (err) 
       return done(err); 

      // if the user is found, then log them in 
      if (user) { 
       return done(null, user); // user found, return that user 
      } else { 
       // if there is no user found with that facebook id, create them 
       var newUser = new User(); 

       // set all of the facebook information in our user model 
       newUser.fb.id = profile.id; // set the users facebook id     
       newUser.fb.access_token = access_token; // we will save the token that facebook provides to the user      
       newUser.fb.firstName = profile.name.givenName; 
       newUser.fb.lastName = profile.name.familyName; // look at the passport user profile to see how names are returned 
       //newUser.fb.email = profile.emails[0].value; // facebook can return multiple emails so we'll take the first 

       // save our user to the database 
       newUser.save(function(err) { 
        if (err) 
         throw err; 

        // if successful, return the new user 
        return done(null, newUser); 
       }); 
      } 

     }); 
    }); 

})); 

}; 

мне не нужно хранить информацию о пользователях в любом хранилище данных. Я хочу сохранить токен только во время входа пользователя в мое веб-приложение, в основном мне не нужно использовать Mongo, потому что все данные, которые будут отображаться в веб-приложении, будут поступать из Facebook api, для например, сообщения для профиля, количество понравившихся на определенных сообщениях и т. д. Мне не нужно иметь бэкэнд как таковой, потому что, если я храню данные в любом хранилище данных, таком как Mongo, при следующем входе в систему пользователя данные будут устаревшими (в некотором роде Facebook api - это своего рода бэкэнд), и я также хочу, чтобы обновления для информации о любых постах, сделанных в Facebook, должны обновляться в реальном времени в моем веб-приложении, например если кому-то нравится сообщение на реальной странице Facebook, количество понравившихся на моем веб-приложении также должно быть обновлено в реальном времени, поэтому сначала не нужно сначала выводить данные из SDK Facebook, а затем хранить его в Монго, почему бы просто не дать его к контроллеру, и оттуда представление может представить данные. Если мой подход неправильный, пожалуйста, исправьте меня.

Таким образом, каждый раз, когда пользователь регистрируется в токене доступа, создается и используется для этого сеанса, когда пользователь выходит из системы, токен доступа уничтожается и полностью исключает необходимость хранения токена и любых данных, используя SDK для Facebook.

+0

Что я думал о том, чтобы использовать в основном угловые модели обработки данных, поступающих из SDK Facebook, а затем контроллер может выполнять свою работу в сочетании с представлениями. – user37940

ответ

0

Заменить вызов функции

User.findOne({ 'id' : profile.id }, function(err, user) { 

С вызовом аутентификации facebook SDk и возвращает объект пользователя, когда это подтверждено.

return done(null, user); 

Пожалуйста, обратитесь ...

https://github.com/jaredhanson/passport-facebook

+0

Я хочу подтвердить, что мой подход правильный для переноса данных из SDK Facebook, а не хранения данных в Mongo и проглатывания данных непосредственно из SDK Facebook и как использовать угловые модели для хранения данных. – user37940

0

вам необходимо создать новый шаблон пользователя в папке модели. Я создал следующее: user.js

var facebook = module.exports.facebook =  { 
    id   : String, 
    token  : String, 
    email  : String, 
    name   : String 
} 

, а затем изменить функции passport.serializeUser и passport.deserializeUser.

passport.serializeUser(function(user, done) { 
     done(null, user.facebook.id); 
    }); 

    // used to deserialize the user 
    //passport.deserializeUser(function(id, done) { 
    passport.deserializeUser(function(id, done) { 
     done(null, { id: User.facebook.id, token: User.facebook.token, name: User.facebook.name, email: User.facebook.email}) 

    }); 

то функция: process.nextTick (функция() {} заменить содержимое по этому коду:

var newUser = User; 
        // set all of the facebook information in our user model 
        newUser.facebook.id = profile.id; // set the users facebook id     
        newUser.facebook.token = token; // we will save the token that facebook provides to the user      
        newUser.facebook.name = profile.name.givenName + ' ' + profile.name.familyName; // look at the passport user profile to see how names are returned 
        newUser.facebook.email = profile.emails[0].value; // facebook can return multiple emails so we'll take the first 

        return done(null, newUser); 

добавить строку profileFields: ['id', 'displayName', 'photos', 'emails', 'name'] в функции passport.use(new FacebookStrategy({}

изменения в profile.ejs файл, удалив локальный информационный div и изменив свойства <% = user.facebook.id%> to <% = user.id%> и т. д. в других.