Когда пользователь нажимает кнопку входа на сайте1, с сайта2 открывается всплывающее окно.
Я предполагаю, что вы используете window.open через iframe, чтобы сделать это, и что вы уже выяснили, как обойти блокировку спама в большинстве браузеров и т. Д.
Так как вы открываете это всплывающее окно как новое окно, вы теперь управляете этим окном, и вы действительно можете отправить материал обратно из нового окна.
Это будет несколько псевдокод, но просто для примера!
Допустим, пользователь входит в систему со ссылкой, похожей на эту:
<a href="" onclick="window.popup=window.open('/twitter/login.php', 'Twitter login', 'width=450,height=500'"</a>
Ваше всплывающее окно теперь может ссылаться на window.popup
, а внутри window.popup исходная страница теперь называется window.opener.
На том же сайте, который открывает всплывающее окно, у вас есть функция, например:
document.handleLogin = function (returnedDataFromPopup) {
console.log(returnedDataFromPopup);
}
После того, как пользователь вошел в систему с помощью oAuth, вам нужно перенаправить на новую страницу, это объясняется в руководствах oAuth и Twitter, и вам нужно сделать так, чтобы перенаправление происходило внутри всплывающего окна, а затем собирать информацию из логин на этой странице и отправьте его обратно в исходный документ и функцию handleLogin.
В зависимости от того, что вы используете, в большинстве реализаций PHP вы делаете что-то вроде этого, чтобы получить данные из логина, и это, конечно же, после выполнения всей работы с токеном и ключом потребителя:
$userinfo = $oAuth->getAttributes(); //or something similar, depends
Таким образом, при перенаправлении из Twitter на новую страницу новая страница будет выглядеть примерно так:
<? php
$userinfo = $oAuth->getAttributes();
?>
<script type="text/javascript">
window.opener.document.handleLogin(<?php echo json_encode($userinfo) ?>);
window.close();
</script>
Это фактически запустит функцию handleLogin () на странице, которая открыла всплывающее окно, и отправит информацию о пользователе из всплывающего окна этой функции на исходной странице, а затем закроет всплывающее окно.
Я использовал эту технику с oAuth, OpenID, Google и т. Д., И она прекрасно работает без необходимости в локальном хранилище, файлах cookie или обновлении страницы, так как вы контролируете всплывающее окно и можете отправлять информацию обратно. и далее, и вы могли бы даже изменить адрес всплывающего окна из начального документа на лету, если хотите, выполнив что-то вроде этого:
window.popup.location.href = 'google.com';
В некоторых случаях это удобно, например, OpenID по умолчанию закроет всплывающее окно и перенаправит document.opener на указанную страницу, это не то, что вам нужно, и для преодоления этого вам придется открыть всплывающее окно в некоторых случайная страница, предпочтительно пустая страница, которой вы управляете, а затем сразу после открытия всплывающего окна перенаправьте ссылку всплывающего окна в Twitter.
Все это выглядит очень сложно, но это выполнимо, и если вы зайдете так далеко, у вас теперь есть данные, и все, что вам нужно сделать, это каким-то образом передать их на сайт1 через iframe, который содержит сайт2. Поскольку принудительное нажатие на самом деле невозможно без веб-сокетов или какого-либо сервера, управляемого событиями, такого как node.js, вам, вероятно, придется полагаться на длительный опрос или что-то еще, есть много способов сделать это, и я уверен, что вы ' Я пойму это, но если у вас есть некоторый контроль над сценариями, работающими на site1, и вы, очевидно, имеете контроль над site2, то вы можете получить доступ к некоторым данным через iframe с помощью небольшого javascript, но я никогда не делал этого, поэтому я не знаю точно, как это работает.
Это не очень актуально, но я не понимаю, почему кому-то было бы полезно войти через ваш сайт с помощью iframe с какого-то другого сайта, и мне все это кажется странным, но это зависит от вас, чтобы понять вне.