跨域cookie - 域间共享数据

跨域cookie - 域间共享数据

问题描述:

我一直在寻找我的案例的任何解决方案,但我还没有找到它。因此我决定分享我的解决方案。跨域cookie - 域间共享数据

CASE

我想分享域之间的一些用户信息。这意味着我想获得关于上周已访问过我的web1.com的用户的所有收集信息,并立即访问web2.com。该用户第一次在web2.com但我已经知道他是谁。

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 ...)时,你知道它是谁。