6

私は Meanjs.org ボイラープレートを使用していますが、Facebook サインアップでサインアップ ページに戻ります。以下は、これまでに行った手順です。

1) Facebook アプリサイト URLの設定

http://localhost:3000/

およびOAuthのコールバックURI

http://localhost:3000/auth/facebook/callback

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 から正しいユーザー プロファイルを取得する方法を教えてくれる人はいますか?

どうもありがとう。

4

2 に答える 2

1

プロファイル フィールドを次のように設定しています

profileFields: ['email','id', 'first_name', 'gender', 'last_name', 'picture']

メールを設定しても、ユーザーが複数のメールを持っている場合、メールが返されることがあります。したがって、メールが返されたかどうかを確認する必要があります profile.email または profile.emails[0].value. 未定義かどうかも確認する必要があります。Facebook に登録してもメール アカウントを確認しない人もいれば、電話番号でサインアップする人もいるからです。どちらの場合も、メールは常に未定義になります。

必須フィールドに値があることを確認したい。

var email = profile.email || profile.emails[0].value;
            if (! email){
              console.log('this user has no email in his FB');
              var err = {message:'this user is missing an email'};
              return done(err);
            }

彼らがメールを持っていれば、今私はこれを行うことができます

newUser.facebook.email = email;

彼らが電子メールを持っていない場合は、プロファイルのセッションを設定して、電子メールの入力を求めるページに送信できます。

面倒に聞こえるかもしれませんが、サード パーティの API からの情報が値を持つことを信頼することはできません。

私がオンラインで見たパスポートの例のほとんどは間違っています。それらはすべて、電子メールが存在することを前提としています。

于 2016-06-24T21:51:31.717 に答える