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); 
       }); 
      } 
     }); 
    })); 

希望,它可以帮助别人。 :)