Потеря файла cookie сеанса PHP при обратном вызове при входе в систему с помощью Apple в ИнтернетеPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Потеря файла cookie сеанса PHP при обратном вызове при входе в систему с помощью Apple в Интернете

Сообщение Anonymous »

Я столкнулся с той же проблемой, что и @whip в прошлом году (сеанс сбрасывается после перенаправления от Apple), когда моя конфигурация PHP пытается реализовать функцию «Войти через Apple» на мой веб-сайт. Я полностью ожидаю, что мои проблемы связаны с непониманием того, как браузер и PHP обрабатывают файлы cookie сеанса. Надеюсь, что благодаря более подробному описанию моей конфигурации и происходящих событий можно будет найти основную проблему и помочь кому-то еще в будущем.
Пример кода и документации для входа с Apple Реализация взята из этого сообщения в блоге. Это один из немногих примеров, в котором описывается настройка необходимого клиента Apple и идентификаторов служб, а также показаны примеры декодирования токенов. (https://developer.okta.com/blog/2019/06 ... with-apple)
Как видите в этом примере есть временная переменная случайного состояния, которая сохраняется в сеансе PHP. Это используется для проверки возвращаемого POST от Apple, чтобы гарантировать, что адресован правильный сеанс ответа. Однако в моем случае POST-запрос перенаправления от Apple приводит (в большинстве случаев, см. ниже) к созданию нового файла cookie PHPSESSID, а ранее сохраненная переменная состояния теряется.
Вот что я сейчас наблюдаю в процессе аутентификации:
  • Сессия запускается в соответствии с инициализацией общей структуры (см. ниже)Вот что я сейчас наблюдаю в процессе аутентификации:

    Сессия запускается в соответствии с инициализацией общей структуры (см. ниже)Вот что я сейчас испытываю в процессе аутентификации:

    Сессия запускается в соответствии с инициализацией общей структуры (см. Ниже)Вот что я сейчас испытываю в потоке аутентификации:

    Сессия запускается в соответствии с инициализацией общей структуры (см. Ниже) li>
    Переменная состояния случайной проверки создана и сохранена в переменной сеанса:
$_SESSION['state'] = bin2hex(random_bytes(5));
  • Ссылка создана для кнопки «Войти с Apple» согласно документации
    Изображение
  • Проверив вкладку «Приложение» инспектора браузера (Chrome), вы можете увидите, что существует файл cookie PHPSESSID, управляющий текущим сеансом. В данном случае он имеет идентификатор tk4bh...
    Изображение

    Нажмите на ссылку, пользователь перейдет с моего сайта на appleid.apple.com, чтобы начать цикл аутентификации.
    Изображение
  • Завершите вход в систему с помощью Apple и нажмите кнопку, чтобы вернуться на мой веб-сайт с POST, содержащим токен аутентификации
    < img alt="ПОЛНЫЙ ВХОД В АККАУНТ APPLE" src="https://i.sstatic.net/xF50nv9i.png" />
  • POST будет перенаправлен обратно на любое указанное перенаправление URL-адрес был указан в исходной ссылке «Войти через Apple» (Примечание: этот URL-адрес необходимо добавить к идентификатору службы Apple, используемому для клиента)
  • Один раз запрос POST возвращается на мой веб-сайт, вы увидите сообщение об ошибке, что запрос не удалось аутентифицировать, поскольку переменная State, предоставленная возвращаемой полезной нагрузкой POST, не соответствует сохраненному $_SESSION['state'] переменная. Это связано с тем, что значение $_SESSION['state'] не установлено.
  • И снова, проверив вкладку «Приложение» инспектора браузера, вы можете увидеть, что есть присутствует файл cookie PHPSESSID, но это новый файл cookie. Идентификатор этого нового файла cookie теперь равен rf1k5...
    Изображение
Однако интересно, что если вы добавите шаг к предыдущему процессу и начнете с совершенно нового файла cookie, а затем пройдете весь процесс, файл cookie сохраняется после обратного запроса POST от Apple и цикла аутентификации. Итак, вы щелкаете правой кнопкой мыши по названию веб-сайта на вкладке «Приложения» инспектора браузера и выбираете «Очистить». Затем обновите страницу входа, чтобы сохранить переменную сеанса State, нажмите кнопку «Войти через Apple», завершите процесс и вернитесь на страницу, чтобы найти успешный вход в систему.
Таким образом, остается вопрос: почему вновь созданный файл cookie может сохраняться в браузере посредством просмотра и перенаправления авторизации Apple, а файл cookie, созданный в какой-то другой момент просмотра пользователем (каждая страница имеет общий тот же метод session_start), а затем используемый для сохранения состояния проверки., переменная постоянно «забывается», и необходимо создать новый файл cookie?

Сайт работает под управлением nginx и PHP 8.1.29. INI-конфигурация текущего сеанса следующая:
Изображение

ПРИМЕЧАНИЕ:
  • session.cookie_lifetime имеет значение 0 (которое я хотел бы сохранить)
  • session.save_path ведет к серверу Redis (который не должен ни на что влиять на стороне клиента браузера, но ??)
  • Все сеансы инициируются одним вызовом в PHP платформа, которая добавляет следующие параметры сеансовых файлов cookie:
//---------------------------------------------------------
// safe wrapper around `session_start` to ensure session id is valid, avoiding PHP warnings/errors
function safe_session_start() {
// if session has already started, just return
if ( session_status() != PHP_SESSION_NONE ) {
return true;
}

if ( isset($_COOKIE[session_name()]) AND ! preg_match('/^[-,a-zA-Z0-9]{1,128}$/', $_COOKIE[session_name()]) ) {
unset($_COOKIE[session_name()]);
}

$options = ['cookie_secure' => COOKIE_SSL, 'cookie_httponly' => true, 'cookie_domain' => COOKIE_DOMAIN, 'cookie_path' => COOKIE_PATH];
return session_start($options);
}
//---------------------------------------------------------


Подробнее здесь: https://stackoverflow.com/questions/790 ... ple-on-web
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»