ユーザーが 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' });