#php #post #redirect #google-signin
Вопрос:
Я работаю с системой входа в Google и в основном нахожусь там. Пользователь успешно входит в систему, и я могу получить доступ к своей таблице пользователей mysql, чтобы просмотреть запись пользователя. После того, как я завершил обработку пользователей и установил переменные $_SESSION, я хочу перенаправить со страницы ПУБЛИКАЦИИ обратно на свою index.php страница. Я знаю, что страница ПУБЛИКАЦИИ выполняется, но перенаправление не работает, и я не вижу никаких ошибок (например, «Невозможно изменить информацию о заголовке — заголовки уже отправлены».
login.php содержит кнопку входа в Google и вызывает функцию js в includes/oauth.js
... lt;script src="https://apis.google.com/js/platform.js" async defergt;lt;/scriptgt; lt;script src="includes/oauth.js"gt;lt;/scriptgt; lt;/headgt; lt;bodygt; lt;div id="content"gt; lt;div class="g-signin2" data-longtitle="true" data-onsuccess="onSignIn"gt;lt;/divgt; ...
Функция onSignIn выполняет процесс входа в систему и извлекает данные пользователя. Он также подготавливает последующий вызов, включая маркер аутентификации
... var xhr = new XMLHttpRequest(); xhr.open('POST', 'includes/oauth.php'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send('idtoken=' id_token); ...
В includes/oauth.php файл принимает токен, проверяет его. Получает идентификатор пользователя, просматривает его в моей базе данных и подготавливает переменные сеанса. На этом этапе он должен перенаправить, но этого не происходит. Я в тупике. Связано ли это с тем, что я использую XMLHttpRequest() для ПУБЛИКАЦИИ?
lt;?php session_start(); ... if (isset($_POST['idtoken'])){ ... $_SESSION["auth"] = true; $_SESSION["userId"] = $row['id']; $_SESSION["userName"] = $row['name']; header("Location: ../index.php"); exit(); } ...
Комментарии:
1. Поскольку вы используете AJAX, перенаправление просто возвращает содержимое
index.php
какxhr.responseText
, оно не заставляет браузер открывать URL-адрес.2. Браузер сам открывает новый URL-адрес только при перенаправлении после отправки формы.
3. Я думал, что это может быть как-то связано с xhr, и на самом деле я заметил содержимое веб-страницы в xhr.ответе. Текст во время отладки.
4. Какие у меня есть варианты для фактического выполнения перенаправления?
5. В
xhr.onreadystatechange
функции используйтеwindow.location = "../index.php"
Ответ №1:
Возможно, страница продолжает загружаться/обрабатываться и не заканчивается? Я работал над аналогичной проблемой, связанной с файлами cookie/сообщениями, и это может быть аналогичное решение. В моем случае мне пришлось использовать cookie_write_close()
, потому что я установил бы файлы cookie, которые зависели бы от текущего session_start()
контекста. Перед добавлением cookie_write_close()
процесс php останется открытым, и загрузка перенаправления не произойдет. Вместо этого время ожидания страницы будет зависеть от настроек тайм-аута сервера.
Ответ №2:
Я обновил includes/oauth.js файл выглядит следующим образом:
var xhr = new XMLHttpRequest(); xhr.open('POST', 'includes/oauth.php'); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { window.location = "../index.php"; xhr.send('idtoken=' id_token);
Теперь все работает нормально!