Я использую Dropbox PHP SDK. Все работало нормально, и внезапно процесс аутентификации больше не работает, пока в код в этой области не было внесено никаких изменений.
Я получаю ошибку «Несоответствие CSRF».
При просмотре всех токенов CSRF в URL все кажется правильным:
CSRF жетоны совпадают. Журнал показывает, что это не так:
[15-May-2015 12:09:44 UTC] /dropbox-auth-finish: CSRF mismatch: Expected 'sW2Zy4OD7YBijNHaeCtyjQ==', got 'L9yH1hf7pgiOY7j7fsFegA=='
Я говорил о поддержке Dropbox API. Они были очень полезны и предложили несколько вещей:
Эта ошибка указывает на то, что значение состояния вернулось к вашему перенаправлению
URI не соответствует токену CSRF, который был сохранен в сеансе.
значение состояния в вашем примере URI перенаправления соответствует заданному значению состояния
к URL-адресу / authorize, так что, похоже, проблема в
значение хранится в сеансе. Несколько вещей приходят на ум, которые могут
вызвать это:
- Вы вызываете WebAuth.start несколько раз для одного процесса авторизации приложения? Если это так, возможно, вы храните токен CSRF
для одного, но переходите к / authorize URL с другим.- Ваше хранилище сеансов не работает правильно? Dropbox PHP SDK использует csrfTokenStore, который вы передаете конструктору WebAuth. Если это
не может сохранить новый токен CSRF или возвращает устаревшие значения,
это может вызвать это несоответствие.- Вы переключаетесь между различными экземплярами своего приложения и получаете доступ к различным сеансам?
Это оказалось первой теоретической проблемой. В фоновом режиме произошел AJAX-вызов, который имел проверку входа в систему, которая также перенаправлялась на страницу авторизации, создавая тем самым несколько запросов. Как только я отключил это, проблема исчезла.
Других решений пока нет …