2016-01-12 7 views
6

私はMEANアプリケーションを開発中です。私は認証、ローカル、Facebook、Googleの戦略にパスポートを使用しています。角クライアントでパスポート - フェイスブックのコールバックを処理する方法は?

私はangularjsクライアントを使用しています。すべてのルーティングはクライアントで処理されます。私はサーバーのデータを消費しています。

パスポート - フェイスブック戦略を使用する場合は、以下のコードをパスポートのドキュメントごとにノードサーバーで使用しています。 「フェイスブックを使用してサインイン」ボタンをユーザーがクリック

<a href="/auth/facebook" class="btn"><i class="fa fa-facebook"></i> Sign in using Facebook</a> 

は、クライアントが最終的に検証するためのFacebookのページにユーザーをリダイレクトします「/ AUTH/Facebookの」ルートにアクセスするときに私が直面しています

app.get('/auth/facebook',passport.authenticate('facebook-auth', { scope : ['email'] })); 
    app.get('/auth/facebook/callback',passport.authenticate('facebook-auth', { 
     successRedirect : '/home', 
     failureRedirect : '/login', 
     scope:['email'] 
    })); 

問題がありますユーザーの資格情報

検証が成功した後、ユーザーは "successRedirect"値で定義されているように "/ home"へのルートにリダイレクトされます。

ここで、成功または失敗のリダイレクトを定義する代わりにカスタムコールバック関数を使用したいと思います。それは以下のようになります。クライアントは、「認証/ログインfacebook /コールバック」ルートを呼び出していないとして、私はここに直面しています

​​

根本的な問題は、私はカスタムコールバックの上に使用することはできません、それはFacebookので呼ばれています。 したがって、上記のコールバックの応答をクライアント側で捕捉するのを待っているハンドラはありません!!

クライアントでjson形式の応答を取得して、サーバー側のリダイレクトを回避し、facebookによる認証が成功した後にクライアントにメッセージとユーザー名を渡す方法が必要です。

私はパスポートをあきらめようとしています。多くのコードを削除する前に、可能な解決策をお探しください!

おかげ

答えて

2

これはFacebookのコールバックハンドラ内の別のエンドポイントにリダイレクトすることによって達成することができます。 facebookからのコールバックでres.json()を実行する必要はありません。なぜなら、authが失敗したか、成功したかどうかを知るためにリクエストを行うからです。 From their docs

// GET /auth/facebook/callback 
// Use passport.authenticate() as route middleware to authenticate the 
// request. If authentication fails, the user will be redirected back to the 
// login page. Otherwise, the primary route function function will be called, 
// which, in this example, will redirect the user to the home page. 

だから、彼らは/auth/fb/callbackを呼び出すときにFacebookはあなたに戻って要求プロセスのコントロールを返しますが、それは次に何をすべきかはあなた次第です。ユーザーが正常に認証されると、セッション全体でreq.userが利用可能になります。この時点で、/accountの例のようなものにリダイレクトし、req.userreq.isAuthenticated()をチェックして、目的のフローを完了できます。

+0

ありがとうございました。 – Designeer

+0

@Designeerよろしくお願いします。 D – onel0p3z

+0

@ onel0p3z私は角度の代わりにreactjsで同じことをやっています。私のサーバーはノード上にあり、私はエクスプレスを使用しています。私は正常に私のサーバー側でパスポート - フェイスブックを実装しました。今、私は '/ auth/facebook'をアンカータグを通して反応させると呼んでいます。しかし、私はそれがサーバーでのみ処理され、サーバー上のresponse.redirectを介して処理したくないので、反応の応答を返す方法がわかりません。このシナリオをどのように処理するかお勧めしますか? – Vijay

関連する問題