web-dev-qa-db-ja.com

Facebookからアクセストークンを取得できません。 OAuthExceptionに「検証コードの検証エラー」と表示された

Javaを使用しており、デモアプリケーションの目的は単純です。ユーザーステータスを更新します。サーバー側フローページ http://developers.facebook.com/docs/authentication 。認証ダイアログを取得し、facebookからコールバックURLにアクセスし、を取得しましたコールバックページでcodeを使用すると、アクセストークンを生成しようとして失敗しました。

ガイドページでは、次のURLを使用してアクセストークンを生成できると記載されています。

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

しかし、私の環境では、次のエラーメッセージが表示されます。

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

Client_id値またはclient_secretパラメーターを変更すると、別のエラーメッセージが表示されるため、すべてのパラメーターが正しいと確信しています。コードパラメーターは、facebookのコールバックから取得したものです。これは正しいはずですよね?本当に何が問題なのかわかりません。

これについて何かアイデアはありますか?ここで立ち往生しています...

43
DeepNightTwo

私は最近、まさにこの問題に対処しました。すべてが一致しましたが、OAuthExceptionで失敗しました。それを機能させたのは、リダイレクトuri(フローの両方のリクエストで)を以下から変更することでした:

http://foo.example.com

http://foo.example.com/

つまり、末尾のスラッシュを追加します。そして、それはうまくいきました。愚かで愚かなが、そこに行く。

64
Chip

私は同じ問題を抱えていて、上記の提案を試みました。彼らは助けてくれましたが、私の場合、問題は私のredir URLにクエリパラメーターがあり、Facebookがそれでクールではなかったことです。したがって、話の教訓は、トークンを交換するために送信したredir urlは元のredir urlと同一である必要があり、クエリパラメータを持つことができないということです。

6
Vinayak Suley

同じ問題がありました。これはURLの違いでしたが、投稿した他のものとは異なり、私のものはHTTPとHTTPSの違いでした。

BigIPはHTTPSリクエストを処理し、HTTP Apacheサーバーに転送します。 BaseFacebookのgetCurrentUrl()関数が呼び出されると、元のHTTPSではなくHTTPが検出されました。その機能を次のように変更しました。

protected function getCurrentUrl() {
    if ((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)) ||
        (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || 
        (isset($_SERVER['HTTP_PSEUDOSSL']) && $_SERVER['HTTP_PSEUDOSSL'] == 'true')) {
      $protocol = 'https://';
    }
    else {
      $protocol = 'http://';
    }
...

このバージョンはHTTP_PSEUDOSSLキー。これが誰かの助けになることを願っています。

3
Brad

私たちもこれを楽しみました。

私たちの場合、URLの末尾のスラッシュはすでにそこにあったので、 FB Debug Tool で使用していたトークンを試してみましたが、検証されたため、FBはリクエスト。

いくつかの調査の後、私は頭のラッパーを見つけました-クエリ文字列ではなくHTTPヘッダーのみでGETを実行したため、FBは文字通りトークンをまったく見ていませんでした。

教訓は、FBデバッグツールでトークンを検証できる場合、リクエストに/ something/amissが含まれている可能性があることです-

「/」がないか、アプリの定義されたURLと一致しない可能性があります(ドメインmistmatchは別のエラーです)。 HTTPS用にApp/Web Urlを定義し、HTTPでリクエストを実行しようとしたことはありませんが、どういうわけかしゃっくりするでしょう。

または、私たちの場合のように、リクエストメソッドが間違っている可能性があります-ヘッダー付きのGETまたはPOSTの両方で2500がスローされるため、クエリ文字列でGETを行う必要があります。

お役に立てば幸いです!

3
Serexx

はい、末尾のスラッシュも私のために働いた、ありがとう!

デバッグの目的で、開発者ページでfbが提供するコードを正確に使用すると役立つことがわかりました。

http://developers.facebook.com/docs/authentication/

動作するようになったら、自分のコードに合うように変更できます。

よくわかりませんが、ドキュメントによると、redirect_uriは同じドメインにある必要があるため、アプリの編集画面で「サイトURL」と「サイトドメイン」の設定が正しいことを確認することもできます。 (これは、キャンバス/タブページのURLとは異なります。)

2
matt

URLの問題もありましたが、解決方法は異なります。 signedRequest を渡していました JavaScript SDK はサーバーに戻り、そこからcode値を使用してアクセスをリクエストしました-トークン。ただし、3.1.1バージョンの Facebook PHP SDK のコメントによると、JavaScript SDKはcodeを_redirect_uri_空の文字列、つまり_""_:

_// the JS SDK puts a code in with the redirect_uri of ''
if (array_key_exists('code', $signed_request)) {
    $code = $signed_request['code'];
    $access_token = $this->getAccessTokenFromCode($code, '');
    if ($access_token) {
       // etc
    }
}
_

_redirect_uri_の_""_を使用するように独自のサーバー側コードを変更した後、アクセストークンの要求は機能しました。

0
user456814

私の場合、私のコードはIEで動作していませんでした。問題は次の行にありました

$user_id = $facebook->getUser();
if ($user_id)

どういうわけかgetUser関数は常に0を返したため、その条件は常に真でした。彼が無効なトークンからそのエラーを生成したより。まあ、私はこれを言って修正しました:

if ($user_id>0)

愚かなもの...

0
Diogo Mendonça