2016-12-01 21 views
0

私の場合の解決方法を探していましたが、見つかりませんでした。そこで私は自分の解決策を分かち合うことに決めましたドメイン間の共有データ - ドメイン間で共有されるデータ

CASE

私はドメイン間の一部のユーザー情報を共有したいです。これは、私はすでに私のweb1.com先週訪問したユーザーに関する収集されたすべての情報を取得し、今web2.comに来てほしいことを意味します。ユーザーは、web2.comで初めてですが、私はすでに彼が誰であるか知っています。

答えて

0

SOLUTION:

要件:

  • PHPサーバー - クッキーを生成し、
  • ユーザデータを提供し、データベース・サーバ(オプション)中央サーバー - あなた(クッキーとユーザーデータを保持します私はPostgresを使用しています。
  • ウェブにJSコードの一部を含む可能性。

PHPサーバーhttp://cookie-server.local index.phpを

<?php 
$hash = array_key_exists('my-cookie', $_COOKIE) ? $_COOKIE["my-cookie"] : NULL; 
try { 
    $connection = new PDO("pgsql:dbname=cookie;host=localhost", 'postgres', 'postgres'); 
    $data = findHash($connection, $hash); 
    if ($data) { 
     setcookie('my-cookie', $data['hash'], strtotime("+1 year")); 
     sendResponse($data); 
    } else { 
     $hash = generateHash(); 
     $data = storeHash($connection, $hash); 
     setcookie('my-cookie', $hash, strtotime("+1 year")); 
    } 
} catch (PDOException $e) { 
    echo $e->getMessage(); 
    die(); 
} 

function findHash($connection, $hash) { 
    $sql = 'SELECT * from cookie WHERE hash = :hash'; 
    $stm = $connection->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 
    $stm->execute(array(':hash' => $hash)); 
    $result = $stm->fetchAll(PDO::FETCH_ASSOC); 
    if ($result === FALSE) { 
     printError($stm->errorInfo()); 
    } 
    return count($result) > 0 ? $result[0] : NULL; 
} 

function sendResponse($data) { 
    header('Content-Type: text/javascript; charset=utf8'); 
    header('Access-Control-Allow-Origin: *'); 
    header('Access-Control-Max-Age: 3628800'); 
    header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE'); 
    echo 'showData('. json_encode($data) .');'; 
} 

function printError($error) { 
    echo 'SQL error: ' . $error[2]; 
    die(); 
} 

function generateHash() { 
    return $hash = md5(uniqid(mt_rand(), TRUE)); 
} 

function storeHash($connection, $hash) { 
    $sql = "INSERT INTO cookie (id, hash) VALUES (nextval('cookie_id_seq'), :hash)"; 
    $stm = $connection->prepare($sql); 
    $result = $stm->execute(['hash' => $hash]); 
    if ($result === FALSE) { 
     printError($stm->errorInfo()); 
    } 
    return [ 
     'id' => $connection->lastInsertId(), 
     'hash' => $hash, 
     'name' => '' 
    ]; 
} 
?> 

基本的なWebページ上のweb1.com

(JSコードHASTは、ユーザーに関する情報を知っている必要がどこにでもあることを)
<html> 
    <body> 
     WEB 1:<br> <span id="hash"></span> 
    </body> 
    <script type="text/javascript"> 
     function showData(data) { 
      document.getElementById('hash').innerHTML = "<br>ID: " + data.id + "<br>Hash: " + data.hash + "<br>Jmeno: " + data.name; 
     } 

     var script = document.createElement("script"); 
     script.type = 'application/javascript'; 
     script.src = "http://cookie-server.local"; 
     document.getElementsByTagName("head")[0].appendChild(script); 
    </script> 
    <script type="text/javascript" src="http://cookie-server.local"> 
</html> 

データベース:

enter image description here

どのように動作しますか?

ユーザーの訪問web1.com、JSコードを実行し、 <script type="text/javascript" src="http://cookie-server.local">ページへのヘッド要素が含まれます。ブラウザはファイルの内容をダウンロードしようとし、サーバにPHPコードを実行します。サーバーは、渡されたクッキーを見て、my-cookieがないことを確認します。したがって、Cookieハッシュを生成し、それをデータベースに格納し、ユーザー(cookie-server.localのドメイン名に「my-cookie」という名前のCookie)に設定し、JSONPでユーザーデータを送信します。サーバーへの別の要求に対しては、以前に生成されたハッシュをデータベースで検索し、有効期限を延長し、ユーザーデータを確実に送信します。以来、このユーザーがJSコードで他のWebページ(web2.com ...)を開くと、それは誰であるかを知ることができます。

関連する問題