Сессия теряется после перенаправления OAuth

Я использую CakePHP 2.4. У меня есть подпись OAuth на моем сайте. % 99,5 знаков успешно, но% 0,5 терпит неудачу. У меня эта ошибка в течение нескольких месяцев. Я пробовал много вещей для отладки и регистрации, но все же я не решил проблему. Хотя большинство запросов хороши, мне нужно решить небольшую часть.

Сценарий выглядит следующим образом:

  • Пользователь нажимает кнопку входа
  • Я получаю токен запроса с сервера (например, yahoo, twitter)
  • Я сохраняю oauth_token в сеансе пользователя
    например, идентификатор сеанса – aaa1234
  • CakePHP создает файл cookie PHPSESSID и сохраняет идентификатор сеанса в этом cookie.

  • Я перенаправляю пользователя на сервер Twitter, и пользователь подтверждает мое приложение

  • Пользователь приходит на мой сайт с помощью oauth verifier
    a) Я использую oauth_token пользователя и oauth_verifier и получаю access_tokens . Идентификатор сеанса – aaa1234 . все хорошо.
    b) Отказ. Потому что я не могу найти 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% ваших клиентов, которые терпят неудачу, являются клиентами с одним (или более) из следующего:

  1. Cookies отключены (чаще)
  2. Браузеры, которые не сохраняют файлы cookie с одного и того же веб-сайта при переключении между HTTP / HTTPS (гораздо реже)

Возможные решения:

  1. инициализируйте cookie на HTTPS, чтобы начать (т.е. сначала проверьте, включен ли пользователь в HTTP, затем перенаправляют его на HTTPS, затем инициализируют сеанс, а затем перенаправляют его на конечную точку oauth). Я лично рекомендую его.

  2. некоторые поставщики oauth берут параметры, чтобы URL перенаправлял пользователя, когда он заканчивал свою аутентификацию. Вы можете использовать это и отправить свой идентификатор сеанса в качестве параметра. – Я не рекомендую это, потому что тогда вы можете разоблачить идентификатор сеанса своего клиента для злоумышленников.

Удачи!

Я бы предположил, что здесь есть деньги. Я столкнулся с этим и раньше (не специально с OAuth, но с другими переадресациями, которые устанавливают cookie сеанса).

Подробнее здесь: Потеря переменных сеанса после перенаправления

Почему вы не проверяете идентификатор сеанса isset или нет, в то время как в случае, когда он приходит в исходное состояние или мы можем сказать, что он отличается от сервера? и другой способ заключается в том, что если мы установим переменную сеанса в один временный var, так что, пока он будет пустым, это будет добавлено к нашей переменной сеанса.

Напишите это в самом начале всех ваших контроллеров:

 !session_id() ? session_start() : ''; 

Я не знаю, почему, но я столкнулся с той же проблемой. Я обнаружил, что идентификатор сеанса каким-то образом теряется, когда перенаправление OAuth используется в CakePHP. Вышеприведенная строка гарантирует, что идентификатор сеанса всегда существует. Надеюсь это поможет.