跨域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>
数据库:
它是如何工作的?
当用户访问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 ...)时,你知道它是谁。