2016-12-01 147 views
0

我一直在尋找我的案例的任何解決方案,但我還沒有找到它。因此我決定分享我的解決方案。跨域cookie - 域間共享數據

CASE

我想分享域之間的一些用戶信息。這意味着我想獲得關於上週已訪問過我的web1.com的用戶的所有收集信息,並立即訪問web2.com。該用戶第一次在web2.com但我已經知道他是誰。

回答

0

SOLUTION:

要求:

  • PHP服務器 - 中央服務器,其產生的cookies,滿足用戶的數據
  • 數據庫服務器(可選) - 保留cookies和用戶數據(你可以使用文件等)我使用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' => '' 
    ]; 
} 
?> 

基本的網頁上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代碼。服務器查看通過的Cookie並找出沒有my-cookie。因此,它會生成cookie哈希,並將其存儲在數據庫中,並將其設置爲用戶(Cookie爲cookie-server.local,名稱爲「my-cookie」),併發送用戶數據JSONP。對於服務器的另一個請求,它會查找之前在數據庫中生成的哈希值,並且只會延長到期時間並確保發送用戶數據。從現在開始,當這個用戶用JS代碼打開任何其他網頁(web2.com ...)時,你知道它是誰。