1

JS クライアントで FB.login を使用しており、サーバーでユーザーの ID を確認したいと考えています。したがって、クライアントは facebook から signedRequest を取得し、それをサーバーに送信します。サーバーはピリオドで分割し、signedRequest の 2 番目の部分を json オブジェクトにデコードします。

サーバー側のリクエストを

https://graph.facebook.com/oauth/access_token?
    client_id=YOUR_APP_ID
   &redirect_uri=YOUR_REDIRECT_URI
   &client_secret=YOUR_APP_SECRET
   &code=CODE_GENERATED_BY_FACEBOOK

デコードされた json は次のようになります。

{"algorithm":"HMAC-SHA256","code":"2.AQCPA_yfx4JHpufjP.3600.1335646800.1-5702286|l11asGeDQTMo3MrMx3SC0PksALj6g","issued_at":1335642445,"user_id":"5232286"}

それは私が必要とするコードですか?B64 エンコードする必要がありますか? これがコードでない場合、どのコードを使用すればよいですか?

_

私が試したこと:

私が使用しようとしているリクエストは次のとおりです。

https://graph.facebook.com/oauth/access_token?client_id=295410083869479&redirect_uri=https://squaredme.appspot.com/facebookredirect&client_secret=44f1TOPSECRETbb8e&code=2.AQCPA_yfx4JHpufjP.3600.1335646800.1-5702286|l11asGeDQTMo3MrMx3SC0PksALj6g

しかし、これはエラーを返します:

{"error":{"message":"Error validating verification code.","type":"OAuthException","code":100}}

これが悪いコードを使用しているためなのか、それとも何なのかわかりません。特に、これは私のローカル開発サーバーで実行されており、squaredme.appspot.com は間違いなく私の IP に解決されません。Facebookがそれをチェックするのか、それとも何をチェックするのかはわかりません-より良いエラーメッセージが表示されると思います。方向性をありがとう!

4

2 に答える 2

4

2 つのフローをどうにかして結合しようとしているため、うまく機能しません。

アプリの URL と署名付きのリクエストを使用して Facebook が iframe に POST する場合、2 つのオプションがあります。キャンバス ページを読み込んで JS SDK を使用してそこでもアクセス トークンを取得しますが、この場合はFB.loginを使用する必要はありません(ポップアップが開き、自動的に閉じられるため)、FB を使用できます。ユーザーを困らせないgetLoginStatusメソッド。

ユーザーが認証されていない場合、署名リクエストには、グラフ API を使用するために必要なものがありません。次に、ユーザーをauth dialogにリダイレクトします。iframe に読み込まれるため、次のように、javascript を使用して親ウィンドウをリダイレクトする html 応答を返す必要があります。

top.location.href = "AUTH_DIALOG_URL";

使用が完了すると (アプリが承認または拒否されると)、認証ダイアログにパラメーターとして追加した "redirect_uri" にリダイレクトされます。ユーザーがアプリを受け入れた場合、クエリ文字列で "code" パラメーターを取得します。次に、コードを取得し、質問に投稿したアクセス トークンと交換してから、ユーザーを「apps.facebook.com/YOUR_APP」にリダイレクトします。

次にページが読み込まれると、ユーザーはすでに認証されており、完全に署名されたリクエストが取得されます。

これで問題が明確になることを願っています。サーバー側のフローを再確認してください。ほぼすべてをカバーしています。

于 2012-04-28T20:10:54.800 に答える
1

私もそれでいくつかの問題を抱えていました、そして私はここStackOverflowで解決策を見つけました。Facebookが提供する「コード」は2種類あります。1つは、クライアント側のフローによって生成されたCookieのsignedRequest内にあります。FacebookのJSSDKはこのコードを処理し、何も言わずにアクセストークンを取得します。

もう1つのタイプのコードは、OAuth URL(サーバー側フロー)に移動すると、リダイレクトURI(http://www.yoururl.com/index.php?code = AAAgyiaus ...)にクエリとして添付されます。このコードを使用して、トークンURLに移動し、アクセストークンを取得します。

サーバー側のフローを使用している場合は、OAuth URLとトークンURLの両方でリダイレクトURIを指定する必要があり、それらは完全に同じである必要があるため、スラッシュやクエリ文字列が欠落している可能性があります。問題。

コードは互いに異なります。両方を一緒に使用すると、CookieのsignedRequest内にあるコードを使用してアクセストークンを取得することは不可能のように見えます。

しかし、そうではありません。魔法は次のとおりです。signedRequestのコードはNOURIに関連付けられているため、redirect_uriが必須フィールドである限り、トークンURLに移動するときに空白を渡すだけです。

したがって、最終的な解決策は次のとおりです。CookieからsignedRequestを取得し、サーバーで解析してコードを取得してから、トークンのURLを読み取ります

https://graph.facebook.com/oauth/access_token?
    client_id=YOUR_APP_ID
    &redirect_uri=&client_secret=YOUR_APP_SECRET
    &code=CODE_INSIDE_THE_SIGNED_REQUEST

ハックのように見えるので、どれくらいの期間機能するかわかりませんが、現在は機能しています。

于 2012-07-25T16:34:08.977 に答える