2

在用户使用 Passport 的 Facebook 策略进行身份验证后,我想呈现一个包含用户个人信息的表单。我正在使用 fbgraph 模块来访问 Facebook API。但是我必须在 site.js 中要求它来检索他的个人信息和 authentication.js 来设置 accessToken。有没有一种优雅的方法来处理这个问题?

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);

网站.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);
   });
};

身份验证.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