2

ユーザーが Passport の Facebook 戦略を使用して認証した後、ユーザーの個人情報を含むフォームをレンダリングしたいと考えています。fbgraph モジュールを使用して Facebook API にアクセスしています。しかし、彼の個人情報を取得するための site.js と accessToken を設定するための authentication.js の両方でそれを要求する必要があります。これに対処するエレガントな方法はありますか?

index.js

var authentication = require ('./authentication');
var site = require('./site');

app.get('/form-fb', site.form_fb);
app.get('/auth/facebook', authentication.authenticate_fb);
app.get('/auth/facebook/callback', authentication.callback_fb);

site.js

var fbgraph = require ('fbgraph');

exports.form_fb = function (req, res){
   fbgraph.get("me?fields=first_name,last_name,email,birthday,gender", function (err, fbres) {
      res.render('form-fb', fbres);
   });
};

authentication.js

var passport = require('passport');
var fbgraph = require ('fbgraph');
var FacebookStrategy = require('passport-facebook').Strategy;
var db = require ('./db');

passport.use(new FacebookStrategy({
    clientID: FACEBOOK_APP_ID,
    clientSecret: FACEBOOK_APP_SECRET,
    callbackURL: FACEBOOK_APP_CALLBACKURL
  },
  function(accessToken, refreshToken, profile, done) {

    fbgraph.setAccessToken(accessToken);

    db.User.findOne({'accounts.uid': profile.id, 'accounts.provider': 'facebook'}, function (err, oldUser){
      if (oldUser){
        console.log('Existing user: ' + oldUser.first_name);
        done(null, oldUser);
      } else {
        var newUser = new db.User();
        var account = {provider: "facebook", uid: profile.id};
        newUser.accounts.push(account);
        newUser.save(function(err) {
          if (err) {throw err};
          console.log ('New user: ' + profile.name.givenName);
          done (null, newUser);
        });
      }
    });
  }
));

exports.authenticate_fb = passport.authenticate('facebook', {scope: FACEBOOK_APP_SCOPE});

exports.callback_fb = passport.authenticate('facebook', { successRedirect: '/form-fb',
                                                       failureRedirect: '/login' }); 
4

0 に答える 0