Я работаю над проектом с TALL Stack, где я реализовал OAuth2 с использованием пакета Laravel Socialite. Изначально я сделал простую ссылку с URI перенаправления. Этот подход работает нормально, пользователь легко проходит аутентификацию в Google и перенаправляется на намеченный маршрут. В настоящее время я хочу, чтобы страница аутентификации Google OAuth2 открывалась во всплывающем окне, и после аутентификации пользователя всплывающее окно закрывается, а затем основная вкладка или окно перенаправляет пользователя на намеченный маршрут после аутентификации. Проблема, с которой я столкнулся сейчас, заключается в том, что пользователь проходит аутентификацию во всплывающем окне, и окно закрывается после аутентификации. Однако главное окно не сохраняет состояние аутентификации пользователя. В результате перенаправление не происходит. Позвольте мне также упомянуть, что это происходит только при первой аутентификации пользователя. После последующей аутентификации пользователя перенаправление происходит во всплывающем окне, и всплывающее окно не закрывается автоматически. Это указывает на то, что пользователь действительно проходит аутентификацию, но только во всплывающем окне, а не в основной вкладке или окне.
Это ссылка для перенаправления на страницу OAuth2
Код: Выделить всё
[url=javascript:void(0);]
[img]{{ asset([/img]
Sign up with Google
[/url]
В JS я открываю всплывающее окно для аутентификации OAuth2, затем прослушиваю событие во всплывающем окне для успешной аутентификации, а затем перенаправляю пользователя на панель управления.
Код: Выделить всё
function openOAuthPopup() {
var popup = window.open('/auth/redirect', 'popup', 'width=700, height=700');
// Listen for messages from the popup
window.addEventListener('message', function(event) {
if (event.origin !== "{{ url('/') }}")
return;
if (event.data === 'authenticated') {
window.location.href = '/dashboard';
}
}, false);
}
Ниже приведен метод PHP для обработки обратного вызова.
Код: Выделить всё
public function callback(): View
{
$googleUser = Socialite::driver('google')->stateless()->user();
//Handle user registration or login
...
return view('livewire.auth.oauth_callback');
}
В представлении livewire.auth.oauth_callback у меня был простой скрипт, который отправляет сообщение в открывающее окно, а затем закрывает всплывающее окно.
Код: Выделить всё
// When the popup loads this view, send a message to the opener window
window.onload = function() {
window.opener.postMessage("authenticated", "{{ url('/') }");
window.close(); // Close the popup window
}
Я не знаю, имеет ли это какое-либо отношение к сеансу. В моем config/session.php все по умолчанию.
Что я делаю не так? Кроме того, есть ли лучший подход к этому?
Подробнее здесь:
https://stackoverflow.com/questions/782 ... in-popup-w