Сегодня рассмотрим как можно сделать общую авторизацию на двух сайтах расположенных на разных доменах. Поставлена задача: при переходе по ссылке на сайте site1.ru автоматически регистрироваться и авторизоваться на сайте site2.ru
Из всех рассмотренных ниже вариантов, самой быстрой и надежной оказалась кросс-доменная коммуникация с помощью JSONP


Первым пришедшим в голову вариантом было – передавать хеш код в ссылке на сайте site1.ru (например href=http://site2.ru?act=auth&hash=2314edwqfjksa231213), хеш генирируется на несколько минут для авторизованного пользователя на сайте site1.ru, но тут есть проблема – если пользователь скопирует эту ссылку и передаст своему другу то от его имени на сайте site2 будет авторизован его друг, да и безопасности никакой.

Вторым вариантом попробовал использовать передачу session_id (пользователя на сайте site1.ru) через iframe, но и тут возникли проблемы безопасности:
«Unsafe JavaScript attempt to access frame with URL http://site2.ru/ from frame with URL http://site1.ru. Domains, protocols and ports must match«

Если нужна только поддрежка браузеров которые знают что такое HTML5 то можно сделать переброс данных через iframe с помощью postMessege, как описано здесь:
http://ternarylabs.com/2011/03/27/secure-cross-domain-iframe-communication/
рабочий пример:
http://jsbin.com/oxesef/9/edit#javascript,html

Затем я наткнулся на статью:
en.wikipedia.org
а тут еще более расписано как можно применять JSONP:
http://habrahabr.ru

Из написанного выше стало ясно что делать и как передать нужные данные с сайта site1 на site2 без особых усилий.
на http://site2.ru/test.php пишем такой код:

parseResponse({success: 'ok', sid: 867578645});

на сайте http://site2.ru/index.php пишем:

<pre id="log"></pre>

<script>
function jsonp(url)
{
    var script = document.createElement("script");
    script.setAttribute("src",url);
    script.setAttribute("type","text/javascript");
    document.body.appendChild(script);
}

jsonp('http://site2.ru/test.php');

function parseResponse(data)
{
    $("#log").html("success: "+data.success+" \r\nsid: "+data.sid);
    // отправляем данные для выдачи по sid данных о пользователе
    $.ajax({
      data: {sid:data.sid},
      type: "POST",
//адрес скрипта получающего данные и регистрирующего или авторизующего на сайте site1
      url: "/auth.php",
      success: function(data){
        alert('success');
      },
    error: function(error){
      alert('requesting error!');
    }
  });
}
</script>

Можно прочесть также:

Комментарии закрыты.