web-dev-qa-db-ja.com

FacebookリダイレクトURLの問題OAuthException

私のアプリは長い間うまく機能していましたが、今はFacebookから次のようなエラーが出ています。

Content: {"error":{"message":"Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request","type":"OAuthException","code":100}}

https://www.facebook.com/dialog/oauth/?client_id=163840537126360&redirect_uri=http://mycloud.niranjan.com/facebook/callback//empty/?vTitle=Facebook&scope=email,sms,user_about_me,friends_about_me,user_activities,friends_activities,user_birthday,friends_birthday,user_education_history,friends_education_history,user_events,friends_events,user_likes,friends_likes,user_location,friends_location,user_photos,friends_photos,user_videos,friends_videos,user_relationships,friends_relationships,user_status,friends_status,user_checkins,friends_checkins,read_stream,publish_stream

誰かがこれの解決策を提案できますか?

19
Niranjan Sagar

これは6週間遅れていることに気づきましたが、うまくいった修正を見つけたので、ここに投稿することにしました。同じ問題があり、戻りURLをエンコードしようとしたが(機能しなかった)、次のようにURLを構築していることに気付きました。

$url = "http://example.com/";
$redirect_script = "/cgi-bin/redirect.cgi";

$redirect_url = $url . $redirect_script;

ただし、これはhttp://example.com//cgi-bin/redirect.cgiのような戻りURLになります。example.comの後にある「//」に注意してください。このURLから二重スラッシュを削除すると、再び機能しました。 OP、リダイレクトURLは/facebook/callback//empty?etcでも同じであることがわかりました。

16
mkania

私の場合、http://127.0.0.1:8000を使用していましたが、FBは自動的にhttp://127.0.0.1:8000/に変更し、OAuthリダイレクトでクエリパラメータを渡して対処します。コード内のURLをエンドスラッシュで問題が解決しました。最終的に使用可能なバージョンが格納され、2番目のリクエストと比較されているのではないかと思います。

15
cyberwombat

ニランジャン、私たちは正確に同じエラーメッセージを見ました。あなたのように、コードに変更を加えることなく、今月から始まりました。

私たちは、redirect_uriが実際に両方の呼び出しでまったく同じであることを注意深く確認しました-最初に承認呼び出し、次にaccess_token呼び出し。

私たちはFacebookに提出しましたが、彼らはそれを「低」としてトリアージしました: https://developers.facebook.com/bugs/307245456075215?browse=search_51964e3320a5b5556208759

私たちの場合、私たちは異常なことをしていました(そのため、これはあなたのケースには関係ないかもしれません)。私たちのredirect_uriは、エンコードされたパス要素として埋め込まれた別のURLを持つURLでした。 FBに渡されるときに二重にエンコードされたURL内のURLが、Facebook APIサーバーで問題を引き起こし始めていました。

ネストされたURLのエンコーディングを%エンコーディングではなく長い16進数に変更することでこれを解決しました。すべてのFacebookサーバーは、パス内に16進数を含む単純なredirect_uriであり、通常のURLエンコーディング/デコーディングの影響を受けません。

私の疑いは、FacebookがURLパラメーターのエンコード/デコードの方法を変更したため、おそらく2回デコードしたことです。

私たちのようなことをしているなら、このアプローチを試してください。そうでない場合は、まったく異なる、より単純なredirect_uriを試して、何かが機能するかどうかを確認します。また、すべてのURLクエリパラメータを正しくエンコード/デコードしていることを確認してください。

12
Steve S

今日も同じ問題がありましたが、問題は、redirect_uriがhttp:// URLスキーマを使用し、Facebookがhttps://しか受け入れないことでした。

4

https://を使用しているが、ログインURLでhttp://を使用している場合、URLの問題についてOAuthExceptionがスローされることに注意してください。

したがって、使用する場合は、ログインURLでhttps://を使用する必要があります。

これは私の問題を解決しました。

1
Jack Trowbridge

Facebookの奇妙な振る舞いに直面しました。

サイトでhttpsが実行されており、「確認コードの検証中にエラーが発生しました。redirect_uriが同じであることを確認してください」というエラーが常に発生します。

しかし、redirect_uriと開発者パネル(OAuth URL)でhttpsをhttpに変更すると、エラーが消えて認証が正しく機能し始めます。しかし、サイトはまだhttpsを実行しています...

これが誰かを助けることを願っています。

1
Gregory Rusakov

私の場合、クエリ文字列の特殊文字が原因で、/=を含むbase64コードがありました。! @ = / ;のような文字をすべて試しましたが、すべて同じエラーがスローされました

有効であるように見える2文字のみが-_#$

P.S/クエリの最後で役に立たなかった。また、クエリ文字列の途中で禁止されていました

1
Mo Hrad A

Mo Hrad A正解です。$文字を使用することすらできませんでした。

パラメータ付きの複雑な戻りURLを使用できるようにする2つの簡単な関数を作成しました。

public static string EncodeFacebookReturnUrl(string url)
{
    return Regex.Replace(HttpUtility.UrlEncode(url), "%", "_-_");
}

public static string DecodeFacebookReturnUrl(string url)
{
    return HttpUtility.UrlDecode(Regex.Replace(url, "_-_", "%"));
}

UrlEncodeを使用して翻訳すると、「不正な」文字(%)が1つだけになり、これを正規の文字列_-_に置き換えます。デコードも簡単にします。

0
RoyBS