私は Meanjs.org ボイラープレートを使用していますが、Facebook サインアップでサインアップ ページに戻ります。以下は、これまでに行った手順です。
1) Facebook アプリサイト URLの設定
およびOAuthのコールバックURI
2) APP_ID と APP_Secret を Client_ID と Client_Secret として配置する
facebook: {
clientID: process.env.FACEBOOK_ID || '*****',
clientSecret: process.env.FACEBOOK_SECRET || '*****',
callbackURL: 'http://localhost:3000/auth/facebook/callback',
profileFields: ['id','emails', 'first_name', 'last_name', 'displayName', 'link', 'about_me', 'photos' ]
},
3) コードは次のとおりです。
--ルート
// Setting the facebook oauth routes
app.route('/auth/facebook').get(passport.authenticate('facebook', {
scope: ['email']
}));
app.route('/auth/facebook/callback').get(users.oauthCallback('facebook'));
-- oauthCallback 関数、
exports.oauthCallback = function(strategy) {
return function(req, res, next) {
passport.authenticate(strategy, function(err, user, redirectURL) {
if (err || !user) {
console.log('1' + err);
//console.log(user);
return res.redirect('/#!/signin');
}
req.login(user, function(err) {
if (err) {
console.log('2' + err);
return res.redirect('/#!/signin');
}
return res.redirect(redirectURL || '/');
});
})(req, res, next);
};
};
-- Passport-Facebook戦略
module.exports = function() {
// Use facebook strategy
passport.use(new FacebookStrategy({
clientID: config.facebook.clientID,
clientSecret: config.facebook.clientSecret,
callbackURL: config.facebook.callbackURL,
passReqToCallback: true
},
function(req, accessToken, refreshToken, profile, done) {
console.log('facebook Strategy Started');
// Set the provider data and include tokens
var providerData = profile._json;
providerData.accessToken = accessToken;
providerData.refreshToken = refreshToken;
// console.log(JSON.stringify(profile));
console.log(profile);
// console.log(JSON.stringify(profile.name.givenName));
// Create the user OAuth profile
var providerUserProfile = {
firstName: profile.name.givenName,
lastName: profile.name.familyName,
displayName: profile.displayName,
email: profile.emails[0].value,
username: profile.username,
provider: 'facebook',
providerIdentifierField: 'id',
providerData: providerData
};
//console.log('provider' + providerUserProfile);
// Save the user OAuth profile
users.saveOAuthUserProfile(req, providerUserProfile, done);
}
));
};
4) デバッグ
oauthCallback 関数でエラーをログに記録すると、次のように返されます。
1TypeError: 未定義のプロパティ '0' を読み取れません
Passport-Facebook モジュールで Facebook がプロファイルとして返すものは次のとおりです。
{ id: 'Id_of_the_person', username:未定義, displayName: 'Full_name_of_person', name: { familyName:未定義, givenName:未定義, middleName:未定義}, 性別:未定義, profileUrl:未定義, プロバイダー: 'facebook', _raw: ' {"name":"Full_name_of_person","id":"Id_of_the_person"}', _json: { name: 'Id_of_the_person', id: 'Id_of_the_person', accessToken: 'access_token_value', refreshToken: undefined } }
ユーザーの電子メールを含め、Facebook から正しいユーザー プロファイルを取得する方法を教えてくれる人はいますか?
どうもありがとう。