2016-07-11 9 views
1

node.jsからパスポートを使用してFacebook認証を設定しようとしています。アプリを起動して/ auth/facebookに行くと、Facebookのページに行き、Facebookにメールを返す許可を与えます。しかし、私がOKを押すと、「このアカウントに関連付けられた電子メールはありません」というページ(コールバック)が表示されます。コードによると、profile.emailsがnullであることを意味します。私は何が欠けていますか?Node.js Passport Facebook認証返信されたメールがありません

これらは私がアプリケーションを起動したときに表示される警告です。彼らが問題なのかどうかはわかりません。

express-session deprecated undefined resave option; provide resave option auth.js:44:37 
express-session deprecated undefined saveUninitialized option; provide saveUninitialized option auth.js:44:37 

ここに認証コードがあります。私はedxのイントロMEANスタックコースM101Xを通ります。

function setupAuth(User, app) { 
    var passport = require('passport'); 
    var FacebookStrategy = require('passport-facebook').Strategy; 

    // High level serialize/de-serialize configuration for passport 
    passport.serializeUser(function(user, done) { 
    done(null, user._id); 
    }); 

    passport.deserializeUser(function(id, done) { 
    User. 
     findOne({ _id : id }). 
     exec(done); 
    }); 

    // Facebook-specific 
    passport.use(new FacebookStrategy(
    { 
     clientID: process.env.FACEBOOK_CLIENT_ID, 
     clientSecret: process.env.FACEBOOK_CLIENT_SECRET, 
     callbackURL: 'http://localhost:3000/auth/facebook/callback' 
    }, 
    function(accessToken, refreshToken, profile, done) { 
     if (!profile.emails || !profile.emails.length) { 
     return done('No emails associated with this account!'); 
     } 

     User.findOneAndUpdate(
     { 'data.oauth': profile.id }, 
     { 
      $set: { 
      'profile.username': profile.emails[0].value, 
      'profile.picture': 'http://graph.facebook.com/' + 
       profile.id.toString() + '/picture?type=large' 
      } 
     }, 
     { 'new': true, upsert: true, runValidators: true }, 
     function(error, user) { 
      done(error, user); 
     }); 
    })); 

    // Express middlewares 
    app.use(require('express-session')({ 
    secret: 'this is a secret' 
    })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 

    // Express routes for auth 
    app.get('/auth/facebook', 
    passport.authenticate('facebook', { scope: ['email'] })); 

    app.get('/auth/facebook/callback', 
    passport.authenticate('facebook', { failureRedirect: '/fail' }), 
    function(req, res) { 
     res.send('Welcome, ' + req.user.profile.username); 
    }); 
} 

module.exports = setupAuth; 

答えて

1

「Facebookの認証問題」の下で、そのコースのディスカッションタブで提案されているようにあなたはpassport.useブロック内profileFieldsを追加してみましたか?

関連する問題