Я использую CakePHP 2.4. У меня есть подпись OAuth на моем сайте. % 99,5 знаков успешно, но% 0,5 терпит неудачу. У меня эта ошибка в течение нескольких месяцев. Я пробовал много вещей для отладки и регистрации, но все же я не решил проблему. Хотя большинство запросов хороши, мне нужно решить небольшую часть.
Сценарий выглядит следующим образом:
oauth_token
в сеансе пользователя aaa1234
CakePHP создает файл cookie PHPSESSID и сохраняет идентификатор сеанса в этом cookie.
Я перенаправляю пользователя на сервер Twitter, и пользователь подтверждает мое приложение
oauth_token
пользователя и oauth_verifier
и получаю access_tokens
. Идентификатор сеанса – aaa1234
. все хорошо. oauth_token
пользователя в текущем сеансе. Когда я проверяю идентификатор сеанса, я вижу, что ID изменен, ID теперь bbb2345
Для сценария b:
Кажется, у пользователя новый идентификатор сеанса. oauth_token
не может быть найден в новом сеансе. Но учтите, что в /tmp/sessions/
folder существуют старые данные /tmp/sessions/
.
Сессия ID cookie не существует для сеанса aaa1234
. Но еще один файл cookie, который я установил 2 дня назад, существует в файлах cookie.
Я проверяю пользовательские агенты.
Это то же самое, когда пользователь впервые приходит, и пользователь возвращается с сервера Yahoo.
Этот сценарий сбоя происходит в браузерах Chrome, Firefox, мобильных браузерах или других браузерах, поэтому я не могу обвинять тип браузера.
Что я должен проверить больше, чтобы диагностировать?
Мои настройки CakePHP core.php:
Configure::write('Session', array( 'defaults' => 'cake' )); Configure::write('Session.cookie', 'MYPHPSESSID'); Configure::write('Session.timeout', 120); Configure::write('Security.level', 'medium');
Другие настройки по умолчанию указаны в файле: https://github.com/cakephp/cakephp/blob/2.5/app/Config/core.php#L182
Изменить: используя этот ответ, я проверил файлы cookie. 20% ошибочных пользователей отключили куки. Я спросил лично и пользователь подтвердил вариант cookie. Но похоже, что другие пользователи не отключили куки. Также некоторые пользователи достигают моего веб-сайта с помощью Android WebViews. В клиентах WebView я уверен, что я не отключу файлы cookie. Также 99% пользователей WebView могут успешно использовать веб-сайт.
Идентификатор сеанса может быть потерян из-за перенаправления между схемами . В случае, если ваш пользователь получил идентификатор сеанса в HTTP, а затем вернулся на HTTPS (или наоборот), его сеанс будет потерян / заменен старым сеансом, который был ранее на этой схеме.
Это не на 100% наверняка, но если бы я был вами, я бы попытался дать ему взгляд (это случилось со мной и в прошлом проекте).
РЕДАКТИРОВАТЬ
Объяснение:
Клиенты получают свою сессию по HTTP , они перенаправляются для целей oauth, и когда они возвращаются, они поступают через HTTPS .
PHP Обычные сессии ($ _SESSION) теряются при переходе между HTTP и HTTPS . Сам сеанс хранится на стороне сервера, но клиент теряет session_id, поэтому сервер не узнает его, и сеанс потерян, поэтому я использовал чистый PHP, 100% ваших клиентов потеряли сеанс на своем пути назад.
CakePHP обрабатывает эту распространенную проблему с помощью файлов cookie, которые сохраняют идентификатор sesion, а затем, когда клиент возвращается без session_id в заголовках запроса, его сеанс восстанавливается из-за cookie. 0.05% ваших клиентов, которые терпят неудачу, являются клиентами с одним (или более) из следующего:
Возможные решения:
инициализируйте cookie на HTTPS, чтобы начать (т.е. сначала проверьте, включен ли пользователь в HTTP, затем перенаправляют его на HTTPS, затем инициализируют сеанс, а затем перенаправляют его на конечную точку oauth). Я лично рекомендую его.
некоторые поставщики oauth берут параметры, чтобы URL перенаправлял пользователя, когда он заканчивал свою аутентификацию. Вы можете использовать это и отправить свой идентификатор сеанса в качестве параметра. – Я не рекомендую это, потому что тогда вы можете разоблачить идентификатор сеанса своего клиента для злоумышленников.
Удачи!
Я бы предположил, что здесь есть деньги. Я столкнулся с этим и раньше (не специально с OAuth, но с другими переадресациями, которые устанавливают cookie сеанса).
Подробнее здесь: Потеря переменных сеанса после перенаправления
Почему вы не проверяете идентификатор сеанса isset или нет, в то время как в случае, когда он приходит в исходное состояние или мы можем сказать, что он отличается от сервера? и другой способ заключается в том, что если мы установим переменную сеанса в один временный var, так что, пока он будет пустым, это будет добавлено к нашей переменной сеанса.
Напишите это в самом начале всех ваших контроллеров:
!session_id() ? session_start() : '';
Я не знаю, почему, но я столкнулся с той же проблемой. Я обнаружил, что идентификатор сеанса каким-то образом теряется, когда перенаправление OAuth используется в CakePHP. Вышеприведенная строка гарантирует, что идентификатор сеанса всегда существует. Надеюсь это поможет.