2016-06-21 19 views
4

passport-facebook認証戦略を使用するNode.jsでWebアプリケーションを作成しようとしています。デフォルトでは、この例で提供されているメカニズムは、ユーザをFacebook APIにリダイレクトすることによって動作し、ユーザはそこにユーザ名とパスワードを入力してログインすることができます。 Facebookがユーザーを確認すると、アプリケーションのコールバックURLにトークンを戻します。パスポート - フェイスブック認証で余分なデータを渡す方法

これは私のアプリケーションでうまくいきます。私は問題なくFacebookを使ってログインできます。しかし、私はログインしようとすると、1つの余分なフィールドをサーバーに渡す必要があります。

基本的に私の計画はTextFieldLogin Buttonを私のホームページに追加することです。ログインに成功した後、コールバック関数が実行されると、このコールバックからTextFieldの値を取得します。それを行う方法はありますか?どんな助けも高く評価されます。

これは私のHTMLページ

<body> 
    <div class="container"> 

     <div class="jumbotron text-center"> 
      <p>Login or Register with:</p> 
      <a href="/auth/facebook" class="btn btn-primary"><span class="fa fa-facebook"></span> Facebook</a> 
     </div> 
    </div> 
</body> 

の体であり、これは私のnod.jsコードです:

app.get('/auth/facebook', passport.authenticate('facebook')); 

app.get('/auth/facebook/callback', passport.authenticate('facebook', { 
    successRedirect : '/dashboard', 
    failureRedirect : '/' 
})); 

app.get('/dashboard', isLoggedIn, function(req, res){ 
    res.render('dashboard.ejs', { 
     user : { 
      name : req.user.facebook.name, 
      profilePic : req.user.facebook.profilePic 
     } 
    }); 
}); 

は基本的に私はちょうど私のLogInボタンの前に余分なTextFieldを追加したいです。そして/dashboardルートから、私はその値TextFieldを取得したいと思います。だから、/dashboardのための私のコードは次のようになります:

app.get('/dashboard', isLoggedIn, function(req, res){ 
    res.render('dashboard.ejs', { 
     user : { 
      role: VALUE_FROM_TEXT_FIELD, 
      name : req.user.facebook.name, 
      profilePic : req.user.facebook.profilePic 
     } 
    }); 
}); 

をだから私は二重の質問があります: 1.フロントエンドからこのTextField値を渡す方法。それはFormまたは何の中にあるべきですか? 2. /dashboardルート内のTextFieldの値を取得するにはどうすればよいですか?

+0

あなたの仕事の例を挙げることはできますか?コールバックURLを使用してパスバックすることができるはずです。 – Pogrindis

答えて

0

標準のPassport.jsではなくカスタムコールバックの使用を検討しましたか? 「ローカル」戦略のための

例は次のとおりです。

app.get('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next); 
}); 

あなたがリクエストに付加価値を渡すと、コールバックにそれを処理することができるはずです。

EDIT:あなたの特定のシナリオでは、あなたはおそらく

app.get('/auth/facebook/callback', function (req, res, next) { 
    passport.authenticate('facebook', function (err, user, info) { 
     if (err) { 
      return next(err); 
      // let the next route handler do its thing... 
      // or you can handle the error yourself within this 
      // callback. 
     } 

     // if the user returns as nothing (doesn't exist) then redirect 
     if (!user) { 
      // this takes the place of failureRedirect 
      return res.redirect('/'); 
     } 
     req.logIn(user, function (err) { 
      if (err) { 
       return next(err); // again - on error, 'next' depending on your requirement. 
      } 
      // this takes the place of successRedirect 
      return res.redirect('/dashboard'); 
     }); 
    })(req, res, next); 
}); 

がうまくいけば、これは明確に:)私がやったこと

+0

私は自分の質問を編集しました。私が与えられたシナリオでどのようにデータを得ることができるか教えてください。私はあなたの例のようなカスタムコールバックを使用することができ、reqオブジェクトからデータを取得できます。しかし、私の例では、ログインが成功した後にデータが必要です。 – user1120675

+0

が更新されました。うまくいけば、これは役に立ちます。 – Ant

+0

お詫び申し上げます。ちょうど私があなたがやっていることのポイントを逃したことを実現しました。戦略の構成方法を分かち合うことはできますか? ie。 passport.use(新しいFacebookStrategy(..) – Ant

0

は合格です...この線に沿って何かを見ていますカスタム関数ではなく、sucessRedirectを使用して変数に渡す必要があります。私の場合、req.session.backurlはアクセスするために認証する必要があったページに戻すために使用されていました。

users.get('/auth/facebook/callback', 
     //req.session.backURL|| 
    passport.authenticate('facebook', { failureRedirect: '/login' }),function(req,res){ 
res.redirect(req.session.backURL||'/'); //custom function used instead of sucessRedirect 

}); 
関連する問題