Поперечные домены для разных доменов - PullRequest
0 голосов
/ 22 января 2012

Мой процесс выглядит следующим образом: пользователь нажимает кнопку входа на сайте 1. На сайте 2 открывается всплывающее окно с просьбой войти в систему с помощью твиттера.Затем он входит в систему - используя oAuth, поэтому страница меняется.После успешного входа в систему всплывающее окно должно закрыться, а код на сайте 1 должен получить уведомление.

Что не работает:

  • WebIntents - ну, примеры на их сайте даже не работали, поэтому я не пробовал это локально ..
  • easyXDM - общается с помощью iframe, а не всплывающего окна.
  • иллюминатор - то же самое, использует iframe.

Ужасное решение - обновлять iframe каждые несколько секунд, чтобы проверить, не вошел ли пользователь уже в систему..

Есть ли лучший способ сделать это?лучшие библиотеки?

Ответы [ 2 ]

1 голос
/ 22 января 2012

Когда пользователь нажимает кнопку входа на сайте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 с какого-то другого сайта, и мне все это кажется странным, но это зависит от вас, чтобы понять вне.

1 голос
/ 22 января 2012

если вы можете отослать всплывающее окно на другую страницу после входа пользователя в систему, вы можете использовать это:

главная страница:

localStorage.setItem('user_signed_in', false); // signed out by default
window.open("http://www.google.com/", "google_window", "menubar=no,resizable=no,scrollbars=no,status=no,width=400,height=300");

(function look_up() {
  if(localStorage.getItem('user_signed_in')) {
    go_on();
  } else {
    setTimeout(look_up, 500)
  }
}());

function go_on() {

...

}

страница ссылки:

localStorage.setItem('user_signed_in', true);
window.close();

Помните, что страница ссылки должна находиться в том же домене, что и ваша главная страница.И не бойтесь плохой поддержки localalstorage в других браузерах , но если вы действительно хотите поддерживать старые версии, вы можете использовать куки , я считаю.

...