1

我試圖讓一個已登錄簽名在用戶或自己的帳戶使用Facebook passport.js Facebook的戰略聯繫,並保存其profile photo, id, gender, timeline cover and token根據userSchema(如user.js製成下面示出模型。Facebook的護照戰略返回500錯誤

我嘗試多種組合,但仍得到任一錯誤500來自Facebook,或者如果顯示的Facebook AUTH,臉譜不能返回(代碼組合,我試過)和保存對象。

PS我已經進入了正確的回調URL Facebook的

PPS:請參考我更新後routes.js及以下更新passport.js

這是我routes.js文件:

app.get('/auth/connect/facebook', passport.authenticate('facebook-connect', { authType: 'rerequest', scope: ['id', 'cover', 'gender', 'photos'] })); 

app.get('/auth/connect/facebook/callback', 
    passport.authenticate('facebook-connect', { 
     successRedirect: '/profile/configure', 
     failureRedirect: '/profile/congigure' 
      // failureFlash: true 
    })); 

passport.js文件的Facebook的連接:

passport.use('facebook-connect', new FacebookStrategy({ 
     clientID: configAuth.facebookAuth.clientID, 
     clientSecret: configAuth.facebookAuth.clientSecret, 
     callbackURL: configAuth.facebookAuth.callbackURL, 
     profileFields: ['id', 'cover', 'gender', 'photos'], 
     enableProof: true 
    }, 
    function(token, refreshToken, profile, cb) { 
     process.nextTick(function() { 
      User.findOne({ 'local.facebook.id': profile.id }, function(err, user) { 
       if (err) 
        return cb(err); 

       if (user) { 
        return cb(null, false, req.flash('fbflash', 'This facebook user is already connected with an account at eBird.')); 
       } else { 

        user.local.facebook.id = profile.id; 
        user.local.facebook.token = token; 
        user.local.profile.gender = profile.gender; 
        user.local.profile.herobg = profile.cover; 
        user.local.profile.dp = user.local.profile.dp ? user.local.profile.dp : profile.photos[0].value; 
        if (user.local.profile.dp == '') { 
         if (user.local.profile.gender == 'male') { 
          user.local.profile.dp = 'http://res.cloudinary.com/pinterested222/image/upload/v1487659283/an-av-3_jxrhwc.png'; 
         } 
         if (user.local.profile.gender == 'female') { 
          user.local.profile.dp = 'http://res.cloudinary.com/pinterested222/image/upload/v1487770814/female-avatar_vvyvtj.png'; 
         } 
        } 

        user.save(function(err) { 
         if (err) 
          throw err; 
         return cb(null, user); 
        }); 

       } 
      }); 
     }); 
    })); 

user.js型號:

var mongoose = require('mongoose'); 
var bcrypt = require('bcrypt-nodejs'); 
var DateOnly = require('mongoose-dateonly')(mongoose); 
var shortid = require('shortid'); 
var uniqueValidator = require('mongoose-unique-validator'); 

var userSchema = mongoose.Schema({ 
    _id: { 
     type: String, 
     default: shortid.generate 
    }, 
    local: { 
     email: String, 
     username: { type: String, unique: true }, 
     firstname: String, 
     surname: String, 
     name: String, 
     role: { type: String, default: 'user' }, 
     department: String, 
     pno: Number, 
     password: String, 
     verified: { type: Boolean, default: false }, 
     profile: { 
      dp: String, 
      createdAt: { type: Date, default: Date.now }, 
      herobg: String, 
      location: String, 
      website: String, 
      gender: String, 
      birthday: DateOnly, 
      lastlogin: { type: Date }, 
      notifications: { 
       name: String, 
       namedp: String, 
       type: { type: String }, 
       date: { type: Date, default: Date.now }, 
       read: { type: Boolean, default: false } 
      } 
     }, 
     facebook: { 
      id: String, 
      token: String 
     } 
    } 
}); 

userSchema.plugin(uniqueValidator, { message: '{Path}:{VALUE} is already taken.' }); 

userSchema.methods.generateHash = function(password) { 
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null); 
}; 

userSchema.methods.validPassword = function(password) { 
    return bcrypt.compareSync(password, this.local.password); 
}; 

// userSchema.methods.bellTimesAgo = function(date); 

module.exports = mongoose.model('User', userSchema); 

錯誤,它拋出我:

The www.facebook.com page isn’t working 

www.facebook.com is currently unable to handle this request. 
HTTP ERROR 500 

任何幫助,將不勝感激, 謝謝。


更新 - 1

read(&從passportjs docs)約passport.authorize()並更新了passport.js文件accordig到passport.authorize(),也更新了我的路線,但還是同樣的問題。

這裏是我的更新passport.js

// Facebook Strategy Updated using authorize 

passport.use(new FacebookStrategy({ 
     clientID: configAuth.facebookAuth.clientID, 
     clientSecret: configAuth.facebookAuth.clientSecret, 
     callbackURL: configAuth.facebookAuth.callbackURL, 
     // profileFields: ['id', 'cover', 'gender', 'photos'], 
     // enableProof: true, 
     passReqToCallback: true 
    }, 
    function(req, accessToken, refreshToken, profile, done) { 
     process.nextTick(function() { 

      if (!req.user) { 
       User.findOne({ 'local.facebook.id': profile.id }, function(err, user) { 
        if (err) 
         return done(err); 

        if (user) { 
         return done(null, false, req.flash('fbflash', 'This facebook user is already connected with an account at eBird.')); 
        } else { 

         user.local.facebook.id = profile.id; 
         user.local.facebook.token = accessToken; 
         user.local.profile.gender = profile.gender; 
         user.local.profile.herobg = profile.cover; 
         user.local.profile.dp = user.local.profile.dp ? user.local.profile.dp : profile.photos[0].value; 
         if (user.local.profile.dp == '') { 
          if (user.local.profile.gender == 'male') { 
           user.local.profile.dp = 'http://res.cloudinary.com/pinterested222/image/upload/v1487659283/an-av-3_jxrhwc.png'; 
          } 
          if (user.local.profile.gender == 'female') { 
           user.local.profile.dp = 'http://res.cloudinary.com/pinterested222/image/upload/v1487770814/female-avatar_vvyvtj.png'; 
          } 
         } 

         user.save(function(err) { 
          if (err) 
           throw err; 
          return done(null, user); 
         }); 

        } 
       }); 

      } else { 
       var user = req.user; 
       user.local.facebook.id = profile.id; 
       user.local.facebook.token = accessToken; 
       user.local.profile.gender = profile.gender; 
       user.local.profile.herobg = profile.cover; 
       user.local.profile.dp = user.local.profile.dp ? user.local.profile.dp : profile.photos[0].value; 
       if (user.local.profile.dp == '') { 
        if (user.local.profile.gender == 'male') { 
         user.local.profile.dp = 'http://res.cloudinary.com/pinterested222/image/upload/v1487659283/an-av-3_jxrhwc.png'; 
        } 
        if (user.local.profile.gender == 'female') { 
         user.local.profile.dp = 'http://res.cloudinary.com/pinterested222/image/upload/v1487770814/female-avatar_vvyvtj.png'; 
        } 
       } 

       user.save(function(err) { 
        if (err) 
         throw err; 
        return done(null, user); 
       }); 
      } 
     }); 
    })); 

這裏是我的更新routes.js

app.get('/auth/connect/facebook', passport.authorize('facebook', { authType: 'rerequest', scope: ['id', 'cover', 'gender', 'photos'] })); 

app.get('/auth/connect/facebook/callback', 
    passport.authorize('facebook', { 
     successRedirect: '/profile/configure', 
     failureRedirect: '/profile/configure' 
      // failureFlash: true 
    }) 
); 

這裏是我的應用程序回調設置從Facebook快照: enter image description here

快照錯誤,臉譜一直扔在: enter image description here

+0

在'passport.authenticate'正確策略中'facebook-connect'?我無法在任何文檔中找到此類信息。如果你使用[passport-facebook](https://github.com/jaredhanson/passport-facebook),應該有'passport.authenticate('facebook',...)' –

+0

@AntonNovik我更新了我的設置,現在使用'passport.authorize('臉譜')'也更新了我的'passport.js'文件,仍然沒有幫助。 –

回答

2

Passport.js documentation說:

價值爲scope選項是供應商特定的。有關支持範圍的詳細信息,請參閱提供商的文檔。

如果您在Facebook documentation中檢查允許的權限,則不會找到'id', 'cover', 'gender', 'photos'等權限。這些項目是一個人的public profile的一部分。

所以,你應該在routes.js從改變scope

scope: ['id', 'cover', 'gender', 'photos']

到:

scope: ['public_profile']

或不指定範圍,因爲public_profile是Facebook的默認權限。

P.S.我告訴你有關「更新1」的代碼版本。

+0

謝謝!刪除範圍對象工作冷靜,我已經添加了一個答案,爲什麼對我有用! –

0

從@ anton-novik獲取靈感,我修復了這個錯誤。

問題出在我的routes.js文件中。首先看一下我上面的routes.js文件,然後按照下面的代碼:

app.get('/auth/connect/facebook', ensureLoggedIn('/login'), passport.authorize('facebook', { authType: 'rerequest' })); 

app.get('/auth/connect/facebook/callback', 
    passport.authenticate('facebook', { 
     successRedirect: '/profile', 
     failureRedirect: '/profile/settings', 
     failureFlash: true 
    }) 
); 

有沒有因爲我正在爲每一個應用程序已經批准了Facebook的請求需要scope

然後更新了我的passport.js文件看起來像這樣:

// // Facebook的戰略

passport.use(new FacebookStrategy({ 
     clientID: configAuth.facebookAuth.clientID, 
     clientSecret: configAuth.facebookAuth.clientSecret, 
     profileFields: ['id', 'picture.type(large)', 'gender', 'cover'], 
     callbackURL: configAuth.facebookAuth.callbackURL, 
     passReqToCallback: true 
    }, 
    function(req, accessToken, refreshToken, profile, done) { 
     process.nextTick(function() { 
      // User is not logged in yet 
      if (!req.user) { 
       User.findOne({ 'local.facebook.id': profile.id }, function(err, user) { 
        if (err) 
         return done(err); 
        if (user) { 
         if (!user.facebook.token) { 
          user.facebook.token = accessToken; 
          user.facebook.name = profile.displayName; 
          user.facebook.email = profile.emails[0].value; 
          user.save(function(err) { 
           if (err) throw err; 
           return done(null, user); 
          }); 
         } 
         return done(null, user); 
        } else { 
         // User should be created here 
         // and saved to mongoose 
        } 
       }); 
      } 
      //else user is logged in and needs to be merged 
      else { 
       console.log(profile); //display the returned json from fb 
       // Connect the user and save the details, since the user already exsists 
       var user = req.user; 
       user.local.facebook.id = profile.id; 
       user.local.facebook.token = accessToken; 
       user.local.profile.gender = profile.gender; 
       user.local.profile.dp = profile.photos[0].value; 
       user.local.profile.herobg = profile._json.cover.source; 

       user.save(function(err) { 
        if (err) 
         throw err; 
        return done(null, user); 
       }); 
      } 
     }); 
    })); 

希望,它可以幫助別人。 :)