web-dev-qa-db-ja.com

facebookエラー「検証コードの検証エラー」

非常に奇妙なエラー。私はgide http://developers.facebook.com/docs/authentication/ を使用します。だから私はFBへのリクエストを作成し、redirect_uriを渡します。 localhostのテストサイトを使用します。だから私が合格したら

redirect_uri = http://localhost/test_blog/index.php

それはうまくいきますが、私が合格すれば

redirect_uri = http://localhost/test_blog/index.php?r = site/oauth2

仕事が欲しくありません。私は使用しようとします

redirect_uri =。 urlencode( ' http://localhost/test_blog/index.php?r = site/oauth2

しかし、動作しません。私は説明しようとします。コードを取得できましたが、 https://graph.facebook.com/me?access_token にアクセスすると、エラー「検証コードの検証エラー」が表示されます。私はエベリングをチェックしました、エラーは?r = site/oauth2にありますが、誰かが私を助けることができるいくつかのパラメータを渡す必要がありますか?私は投稿を読む http://forum.developers.facebook.net/viewtopic.php?id=70855 しかし、私には何も動作しません

54
kusanagi

現在(2011年3月現在)、有効なredirect_uriを作成する理由に関する文書化されていない要件があります。

最初に、許可するredirect_uriパラメーターとaccess_tokenの両方が一致する必要があります

Facebook(またはOAuth2)は、redirect_uriをaccess_tokenリクエストに対して返されたコードをエンコードする内部キーとして使用しているようです。あなたのサイトに戻って検証するので、それはちょっと賢いです。それ以外の場合はredirect_uriパラメータを必要としないaccess_tokenリクエストに必要な理由を説明します。

第二に、redirect_uriで多くの特殊文字を使用することはできません

パラメーターをまったく渡すことができるかどうかについて、多くの議論が激化しています。有効な文字は限られていますが、私が知っているリストを公開している人はいません。 percent(%)が無効なため、url/htmlエンコーディングなどの従来の方法は失敗します。スラッシュ(/)も無効なので、ネストされたリダイレクトURLは常に失敗します。特殊文字の制限を克服する唯一の方法は、パラメーターの値をbase64にエンコードすることです。 ASP.NETを使用している場合は、Convert.ToBase64を検索してください。

最後に、これはサイドノートです。単純な解決策はtype = client_credを渡すことであるという誤った情報を伝える多くのプログラマーがいます。これにより、認証でリクエストした権限の一部へのアクセスが制限される場合があります。お勧めできません。

128
Michael

redirect_uri=http://localhost:8000http%3A%2F%2Flocalhost%3A8000にエンコードされた)でテストすると、一日中同じ問題がありました...

解決策は、URIの末尾に末尾のスラッシュ/を必ず配置することです。 redirect_uri=http://localhost:8000/http%3A%2F%2Flocalhost%3A8000%2Fにエンコード)。

繰り返しますが、redirect_uriが両方のリクエストで同一であることを確認してください。

51
Jason

この問題が発生しました。同じ$ varを持つクラスを使用しているため、URLが同じであるという事実を知っていましたが、JSON応答で400応答とそのエラーを取得し続けました。

私がやったことは、redirect_uriを次のように変更することだけでした:

http://myredirecturi.com

http://myredirecturi.com/

うん、最後のスラッシュを追加しただけでうまくいきました。

17
Adam Waite

本当にエンコードする必要はありません。redirect_urlの最後に「/」を付けるだけで問題ありません。

8
Nizar B.

アーロン・ウィーラーによって提供された情報の一部は間違っています。

'redirect_uri'パラメーターは両方のリクエストで同一でなければならないのは事実ですが、通常のURLをURLエンコードすることは完全に可能ですであり、それを 'redirect_url'パラメーターの値として使用する限り、インラインURLをさらにURLエンコードするよう注意してください。

たとえば、facebookから次のURLにリダイレクトしたい場合:

http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants

ユーザーをリダイレクトしようとしています

'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri='
. urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants');

/Party/Pantsは無効なURLを作成します

ただし、へのリダイレクト

'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri='
.urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1='
.urlencode('/Party/pants'));

期待どおりに動作します。

2番目の返されたredrect_uri値を使用している場合は、アプリケーションリクエストを認証します。必ずurlエンコードを再度実行してください-$ _ GETスーパーグローバルを設定するときに値は自動的にURLデコードされます。 -これが私をつまずかせたものです。

'https://graph.facebook.com/oauth/access_token?client_id=12345&&client_secret=SECRET&code=1234567'
.urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1='
.urlencode($_GET['my_param_1']));

追伸実際のコードでは、読みやすくするために、私の例のように文字列を連結するのではなく、sprintf()を使用することをお勧めします。

6
John

私が見ることができることから、ここでの問題は、redirect_uriが「/」で終わる必要があり、「?」を含まないということです。または他の特殊文字。それが「検証コードの検証エラー」を取得している理由だと思います。このエラーは、file_get_contents()を使用している場合にのみ表示され、facebook phpライブラリを使用している場合には表示されません。これはphpの解決策です。このエラーが他のSDKに表示されるかどうかはわかりません。

5
DannyD

それが役立つかどうかはわかりませんが、URLの値のみをエンコードすることをお勧めします。全部ではありません。例えば:

redirect_uri='http://localhost/test_blog/index.php?r='.urlencode('site/oauth2');
2
Ivan

私はpbを持っていて、最後にURLにtype = client_credパラメータを追加して修正しました。

1
juamee

私はちょうど同じ問題を抱えていました。

確かに、私はスーパーn00bなので、このソリューションが実際の実践で意味をなさない場合は、すみません。

FB Connectボタンを使用して、ページ内のテスト変数に短いヒューズCookie(1〜2分)を設定するだけです。 FBがデータ解析/処理スクリプトに情報を返したときに、リダイレクト先のCookieをチェックし、見つかった場合は、header:locationを使用してユーザーを適切なURLにリダイレクトしました。

もちろん、一部のブラウザ/ユーザーなどはクッキーを無効にします。これは明らかにそこでは機能しません(おそらくセッション変数を使用してfbデータハンドラで破棄しますか?)それを行うより良い方法があると確信していますが、現時点ではこの絆創膏は機能します。

0
Evan M. Rose

私の答えはこれでした:

$user = $facebook->getUser();     
if (!$user) {
    $loginUrl = $facebook->getLoginUrl(array(
        'scope' => '',
        'redirect_uri' => $this->domain,
    ));
    print('<script> top.location.href=\'' . $loginUrl . '\'</script>');
}

私はこの解決策を見つける前に頭を悩ませてきましたが、この問題を抱えているのは私だけではないようです。

0

あなたがYiiを使用していることに気付きました。これも同様に使用しており、半日同じ問題が発生しました。前述のように、問題はURLの特殊文字i.e. r=site/oath2

URLをindex.php/site/oath2

ただし、末尾のスラッシュなしで機能するようです。

0
Larry Weya