web-dev-qa-db-ja.com

Facebook OAuth:カスタムcallback_uriパラメーター

Facebook OAuth2統合用の動的リダイレクトURLが必要です。たとえば、FacebookアプリでリダイレクトURLがこれである場合:

http://www.mysite.com/oauth_callback?foo=bar

特定のリクエストのリダイレクトURLを次のようにしたいので、サーバー上で認証コードを処理する方法に関するコンテキストがあります。

http://www.mysite.com/oauth_callback?foo=bar&user=6234

承認ダイアログが送信された後にリダイレクトが呼び出され、認証コードが返されますが、アクセストークンを取得しようとすると、FacebookからOAuthExceptionエラーが返されます。私の要求は次のようになります(わかりやすくするために改行が追加されています)。

 https://graph.facebook.com/oauth/access_token 
?client_id = MY_CLIENT_ID 
&r​​edirect_uri = http%3A%2F%2Fwww.mysite.com%2Foauth_callback%3Ffoo% 3Dbar%26user%3D6234 
&client_secret = MY_SECRET 
&code = RECEIVED_CODE 

私のパラメーターはすべてURLエンコードされており、コードは有効に見えるため、問題のパラメーターは私のredirect_uriであると推測されます。 redirect_uriを次のすべてに設定しようとしましたが、役に立ちませんでした。

  1. 私のサイトへのリクエストの実際のURL
  2. サイトへのリクエストのURLからcodeパラメーターを引いたもの
  3. Facebookアプリケーションの構成で指定されたURL

カスタムリダイレクトURIパラメーターはサポートされていますか?その場合、それらを正しく指定していますか?そうでない場合、Cookieの設定を強制されますか、それともWebサイトにコンテキストを提供するためのより良いパターンがありますか

68
Jacob

答えを見つけました。リダイレクトURLにパラメーターを追加するのではなく、stateパラメーターをhttps://www.facebook.com/dialog/oauthへのリクエストに追加できます。

 https://www.facebook.com/dialog/oauth 
?client_id = MY_CLIENT_ID 
&scope = MY_SCOPE 
&r​​edirect_uri = http%3A%2F%2Fwww。 mysite.com%2Foauth_callback%3Ffoo%3Dbar 
&state = 6234 

その状態パラメーターは、コールバックURLに渡されます。

93
Jacob

何らかの理由で、ジェイコブが提案したオプションを使用できない場合は、渡す前にrlencoderedirect_uriパラメーターを使用すると、完全な場合でも機能しますfoo=bar&morefoo=morebarのようなクエリ文字列。

12
Manuel Pedrera

このチュートリアル に従って、API v2.9に対してFacebookログインワークフローを実装しようとしていました。上記のソリューションを試しました。 Manuelの答えは一種の正しいものですが、私が観察したのはURLエンコードが必要ないということです。さらに、1つのパラメーターのみを渡すことができます。最初のクエリパラメータのみが考慮され、残りは無視されます。以下に例を示します。

  1. https://www.facebook.com/v2.9/dialog/oauth?client_id={app-id}&redirect_uri=http://{url}/login-redirect?myExtraParameter={some-value}を介してコードをリクエストします

  2. URLのコールバックを取得します。 http://{url}/login-redirect?code={code-from-facebook}&myExtraParameter={value-passed-in-step-1}のようになります。 facebookはmyExtraParameterでコールバックを行うことに注意してください。コールバックURLからmyExtraParameterの値を抽出できます。

  3. その後、https://graph.facebook.com/v2.9/oauth/access_token?client_id={app-id}&client_secret={app-secret}&code={code-from-facebook}&redirect_uri=http://{url}/login-redirect?myExtraParameter={value-extracted-in-step-2}でアクセストークンをリクエストできます

最初のクエリパラメータの後に手順1で渡された追加のパラメータは無視されます。また、クエリパラメータに無効な文字を含めないでください(詳細については this を参照してください)。

3
mert