2017-08-26 11 views
0

私はPassportJSを使用しています。私は自分のサイトのユーザーを認証するFacebook-Strategyです。PassportJS経由でFacebookから選択解除された値を処理する

ユーザーがFacebookのポップアップで何かを選択解除していないときは、すべてがうまくいきます。

しかし、ユーザーが電子メールの選択を解除すると、明らかにユーザーの制御下にあることはわかりません。

私の質問は、私が再試行したデータに基づいてそれらを「どこか他の人たち」に導く方法は何ですか?

passport.use(new FacebookStrategy({ 
clientID: config.facebook.appID, 
clientSecret: config.facebook.appSecret, 
callbackURL: config.facebook.callbackURL, 
profileFields: ['displayName', 'picture.type(large)', 'emails', 'birthday', 'location']}, 
function(accessToken, refreshToken, profile, done){ 

    var newUser = new userModel({ 
     fullname : profile.displayName, 
     profilePic : profile.photos[0].value || '', 
     email  : profile.emails[0].value || '', 
     birthday : profile._json.birthday || '', 
     location : profile._json.location.name || '', 
    }); 

    newUser.save(function(err){ 
     done(null, newUser); 
    }); 
); 
} 

私は、もちろん、プリプロセッサのいくつかの並べ替えを行うことができますが、データが有効でない場合、私は私が何をする必要があるか分かりません。たとえば、「Eメール」が必須であるとします。ユーザーに「必須の電子メールフィールドを入力していない場合は、入力してください」と伝え、プロファイル設定ページに移動します。

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

そして、それは以下のNodeJSルートです:Facebookアプリ上

私のコールバックURLです

router.get('/auth/facebook/callback', passport.authenticate('facebook', { 
    successRedirect:'/wall', 
    failureRedirect:'/login' 
})); 

任意の入力が役立ちます。

ありがとうございます。

答えて

0

ここでは、ユーザーはメールフィールドの選択を解除しないと思います。 Facebookは、あなたが要求したすべてのユーザーデータを提供します。しかし、Facebookのユーザーメールが確認されていない場合は、その情報が表示されません email:profile.emails[0].value、つまり、メールのフィールドは空になります。電子メールがあなたにとって必須であると思われる場合は、ログインが成功するたびに、電子メールフィールドが空であるかどうかをチェックするコードを記述します。空白の場合は、ユーザーに電子メールの入力を求めるフォームを作成します。 私はMongoDBのを使用し、パスポートのコードが

var User = require('../models/user'); 
    passport.use(new FacebookStrategy({ 
     clientID: configAuth.facebookAuth.clientID, 
     clientSecret: configAuth.facebookAuth.clientSecret, 
     callbackURL: configAuth.facebookAuth.callbackURL, 
     profileFields: ['id', 'email', 'first_name', 'last_name'], 
     }, 
     function(token, refreshToken, profile, done) { 
     process.nextTick(function() { 
      User.findOne({ 'facebook.id': profile.id }, function(err, user) { 
      if (err) 
       return done(err); 
      if (user) { 
       return done(null, user); 
      } else { 
       var newUser = new User(); 
       newUser.facebook.id = profile.id; 
       newUser.facebook.token = token; 
       newUser.facebook.name = profile.name.givenName + ' ' + profile.name.familyName; 
       if(profile.emails !=null) 
    { 
       newUser.facebook.email = (profile.emails[0].value || '').toLowerCase(); 
    } 
    else 
    { 
    //write your code here to use the form and request the email from the user and then add that email to your database. 
    } 
       newUser.save(function(err) { 
       if (err) 
        console.log(err); 
       return done(null, newUser); 
       }); 
      } 
      }); 
     }); 
     })); 

さて、あなたは成功リダイレクトと失敗リダイレクトのnodejsルートを変更する必要はありません、このようになります。

+0

正確に。私の質問は - どのように私はフォームを持つ特定のページにユーザーを "リダイレクト"するのですか?私はsuccessRedirectとfailureRedirectしか見ることができません。ありがとう –

+0

私は私の答えを編集して、それをチェックしました。 – Gousia

+0

こんにちは。私は私がはっきりしていないかもしれないと思う。私が上に見ているのは、変数が提供されているかどうかをチェックする方法です。リダイレクトがどのように機能するのか分かりません。私はサイト全体でデータの検証を行ってきましたが、わからないことは、提供されたデータに基づいて特定のページにユーザーをルーティングする方法です。私は今、私が明らかになったことを願っていますありがとう –

関連する問題