用户使用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);
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' });