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のコールバックから取得したものです。これは正しいはずですよね?本当に何が問題なのかわかりません。
これについて何かアイデアはありますか?ここで立ち往生しています...
私は最近、まさにこの問題に対処しました。すべてが一致しましたが、OAuthExceptionで失敗しました。それを機能させたのは、リダイレクトuri(フローの両方のリクエストで)を以下から変更することでした:
に
つまり、末尾のスラッシュを追加します。そして、それはうまくいきました。愚かで愚かなが、そこに行く。
私は同じ問題を抱えていて、上記の提案を試みました。彼らは助けてくれましたが、私の場合、問題は私のredir URLにクエリパラメーターがあり、Facebookがそれでクールではなかったことです。したがって、話の教訓は、トークンを交換するために送信したredir urlは元のredir urlと同一である必要があり、クエリパラメータを持つことができないということです。
同じ問題がありました。これは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
キー。これが誰かの助けになることを願っています。
私たちもこれを楽しみました。
私たちの場合、URLの末尾のスラッシュはすでにそこにあったので、 FB Debug Tool で使用していたトークンを試してみましたが、検証されたため、FBはリクエスト。
いくつかの調査の後、私は頭のラッパーを見つけました-クエリ文字列ではなくHTTPヘッダーのみでGETを実行したため、FBは文字通りトークンをまったく見ていませんでした。
教訓は、FBデバッグツールでトークンを検証できる場合、リクエストに/ something/amissが含まれている可能性があることです-
「/」がないか、アプリの定義されたURLと一致しない可能性があります(ドメインmistmatchは別のエラーです)。 HTTPS用にApp/Web Urlを定義し、HTTPでリクエストを実行しようとしたことはありませんが、どういうわけかしゃっくりするでしょう。
または、私たちの場合のように、リクエストメソッドが間違っている可能性があります-ヘッダー付きのGETまたはPOSTの両方で2500がスローされるため、クエリ文字列でGETを行う必要があります。
お役に立てば幸いです!
はい、末尾のスラッシュも私のために働いた、ありがとう!
デバッグの目的で、開発者ページでfbが提供するコードを正確に使用すると役立つことがわかりました。
http://developers.facebook.com/docs/authentication/
動作するようになったら、自分のコードに合うように変更できます。
よくわかりませんが、ドキュメントによると、redirect_uriは同じドメインにある必要があるため、アプリの編集画面で「サイトURL」と「サイトドメイン」の設定が正しいことを確認することもできます。 (これは、キャンバス/タブページのURLとは異なります。)
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
_の_""
_を使用するように独自のサーバー側コードを変更した後、アクセストークンの要求は機能しました。
私の場合、私のコードはIEで動作していませんでした。問題は次の行にありました
$user_id = $facebook->getUser();
if ($user_id)
どういうわけかgetUser関数は常に0を返したため、その条件は常に真でした。彼が無効なトークンからそのエラーを生成したより。まあ、私はこれを言って修正しました:
if ($user_id>0)
愚かなもの...