跨域cookie - 域之间的共享数据

时间:2016-12-01 14:55:07

标签: cookies cross-domain share user-data

我一直在为我的案子寻找任何解决方案,但我还没有找到它。因此我决定分享我的解决方案。

CASE

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

1 个答案:

答案 0 :(得分:0)

<强> SOLUTION:

<强>要求:

  • PHP服务器 - 生成cookie并提供用户数据的中央服务器
  • 数据库服务器(可选) - 保留cookie和用户数据(您可以使用文件等)我使用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代码无处不在,您需要知道有关用户的信息)

<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名称为&#34; my-cookie&#34;对于域cookie-server.local)并使用JSONP发送用户数据。对于服务器的另一个请求,它在数据库中找到先前生成的哈希值,并且只延长到期时间并确保发送用户数据。从现在开始,当这个用户使用JS代码打开任何其他网页(web2.com ...)时,你知道它是谁。