2

I use the Dropbox PHP SDK. Everything was working fine and suddenly the authentication process no longer works while no changes have been made to the code in this area.

I receive the error 'CSRF Mismatch'.

When looking at all CSRF tokens in the URL all seems to be correct:

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 Tokens match. Log reveals they are not though:

[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 的状态值匹配,因此看起来问题出在会话中存储的值上。想到一些可能导致这种情况的事情:

  • 您是否为单个应用程序授权流程多次调用 WebAuth.start ?如果是这样,您可能正在为其中一个存储 CSRF 令牌,但正在与另一个一起浏览 /authorize URL。
  • 您的会话存储是否工作不正常?Dropbox PHP SDK 使用您传递给 WebAuth 构造函数的 csrfTokenStore。如果它无法存储新的 CSRF 令牌,或者返回过时的值,则可能导致这种不匹配。
  • 您是否在应用程序的不同实例之间切换,从而访问不同的会话?

结果证明这是第一个理论化的问题。AJAX 调用发生在后台,它有一个登录检查,也重定向到授权页面,从而创建了多个请求。一旦我禁用它,问题就消失了。

于 2015-05-15T20:24:48.317 回答