2

Dropbox PHP SDK を使用しています。すべてが正常に機能していましたが、この領域のコードに変更が加えられていないにもかかわらず、突然認証プロセスが機能しなくなりました。

「CSRF 不一致」というエラーが表示されます。

URL 内のすべての CSRF トークンを見ると、すべて正しいように見えます。

https://www.dropbox.com/1/oauth2/authorize?locale=&client_id=redacted&response_type=code&redirect_uri=https%3A%2F%2Fmyapp.herokuapp.com%2Fdropbox%2Fcallback.php&state=L9yH1hf7pgiOY7j7fsFegA%3D%3D

https://myapp.herokuapp.com/dropbox/callback.php?state=L9yH1hf7pgiOY7j7fsFegA%3D%3D&code=redacted

CSRF トークンが一致します。ログは、それらがそうではないことを明らかにしています:

[15-May-2015 12:09:44 UTC] /dropbox-auth-finish: CSRF mismatch: Expected 'sW2Zy4OD7YBijNHaeCtyjQ==', got 'L9yH1hf7pgiOY7j7fsFegA=='
4

1 に答える 1

0

Dropbox API サポートに話を聞きました。彼らは非常に役に立ち、多くのことを提案してくれました。

このエラーは、リダイレクト URI に返された状態値が、セッションに保存された CSRF トークンと一致しないことを示しています。ただし、サンプルのリダイレクト URI の状態値は /authorize URL に指定された状態値と一致するため、問題はセッションに保存されている値にあるようです。これを引き起こす可能性のあるいくつかのことが思い浮かびます。

  • 1 つのアプリ承認フローに対して WebAuth.start を複数回呼び出していますか? その場合、一方の CSRF トークンを保存しているが、他方で /authorize URL を参照している可能性があります。
  • セッション ストレージが正しく機能していませんか? Dropbox PHP SDK は、WebAuth コンストラクターに渡す csrfTokenStore を使用します。それが新しい CSRF トークンを保存できない場合、または古い値を返す場合、この不一致が発生する可能性があります。
  • アプリのさまざまなインスタンスを切り替えて、さまざまなセッションにアクセスしていますか?

それは最初の理論化された問題であることが判明しました。バックグラウンドで AJAX 呼び出しが発生し、認証ページにもリダイレクトされるログイン チェックが行われたため、複数の要求が作成されました。これを無効にすると、問題はなくなりました。

于 2015-05-15T20:24:48.317 に答える