2016-08-16 6 views
0

私はパスポート - フェイスブック戦略を自分のアプリケーションに実装しようとしていますが、いくつかの問題が発生しているようです。モデル作成が作成されずに未定義の状態に戻る - 帆JS

私は正常にFacebookに電話して返信することができますが、ユーザーを自分のデータベースに保存しようとしても何も起こりません。

私のコードでは、ユーザーが新しいエントリを作成しない場合は、そのユーザーがデータベースに既に存在するかどうかを確認したい場合は、詳細を返します。

passport.use(new FacebookStrategy({ 
    clientID: '123', 
    clientSecret: '123', 
    callbackURL: 'http://localhost:1337/auth/facebook/callback', 
    profileFields: ['email'] 
}, 
    function(accessToken, refreshToken, profile, done) { 
    User.findOne({ email: profile.emails[0].value}, function(err, user){ 
     if (err) { return done(err); } 
     if (!user || user == 'false') { 
     console.log('No user found'); 
     console.log(profile.id); 
     User.create({facebookId: profile.id, email: profile.emails[0].value}, function(err, user){ 
      return done(null, user, { message: 'Facebook user created'}); 
     }) 
     } else { 
     console.log(user); 
     return done(null, user, { message: 'User already registered'}); 
     } 
    }) 
    } 
)); 

User.createステートメントは実行されませんが、プロファイルIDはメールと同様にログアウトできます。

また、私はpassport-localを実装しています。ユーザーモデルにデータを投稿すると、ユーザーはうまく作成されます。参考のため

、私のユーザモデルは次のようになります。

module.exports = { 

    connection: 'someMongodbServer', 

    attributes: { 
    facebookId: { 
     type: 'integer', 
     unique: true 
    }, 
    email: { 
     type: 'email', 
     required: true, 
     unique: true, 
    }, 
    password: { 
     type: 'string', 
     minLength: 6, 
    }, 
    toJSON: function() { 
     var obj = this.toObject(); 
     delete obj.password; 
     return obj; 
    } 
    }, 
    beforeCreate: function(user, cb) { 
    if(user.password){ 
     bcrypt.genSalt(10, function(err, salt){ 
     bcrypt.hash(user.password, salt, function(err, hash){ 
      if(err) { 
      console.log(err); 
      cb(err) 
      } else { 
      user.password = hash; 
      cb(); 
      } 
     }); 
     }); 
    } 
    } 
}; 

誰もが私が間違って行くこともできる場所を知っていますか?

答えて

0

それを解決するために管理された、私のために愚かな間違いだった。

UserモデルはbeforeCreate関数を呼び出してパスワードをハッシュします。 PassportのFacebook戦略を使用していたので、Facebookユーザーのパスワードはありません。そのためにifステートメントを追加しました。

if(user.password){ 

私が逃していたのは、この関数のコールバックがパスワードではない場合でした。 beforeCreate関数の解決策は次のとおりです。

beforeCreate: function(user, cb) { 
    if(user.password){ 
     bcrypt.genSalt(10, function(err, salt){ 
     bcrypt.hash(user.password, salt, function(err, hash){ 
      if(err) { 
      console.log(err); 
      cb(err) 
      } else { 
      user.password = hash; 
      cb(); 
      } 
     }); 
     }); 
    } 
    cb(); 
    } 
関連する問題