怎么实现多个域名共享 cookie?

2020-06-04 18:05:25 +08:00
 istill
需求场景:有 3 个不同域名的网站,页面上都会显示客服的微信号,客服微信有多个,但是页面上只显示一个客服微信号。对于同一个访客,无论访客打开 3 个中的哪个网站,对该访客显示的微信号都要固定的不变的。

我本想对访客设置 cookie,cookie 中记录访客第一次访问时显示的哪个微信号,以后再访问这 3 个网站时都显示这个微信号。但是 cookie 不能跨域,aaa.com 的 cookie 在访问 bbb.com 时不会自动发送。

所以想在 3 个网站的 HTML 中再加入同一个访问,比如:<img src="http://abc.com/111.png">,111.png 是很小不可见的图片,只为发起请求用,然后再对 abc.com 设置 cookie,也从 abc.com 获取 cookie,从而达到跨域的目的。

不知这个思路行不行,如果不行,请指点一下新思路,感谢!
8442 次点击
所在节点    Python
21 条回复
hackzx
2020-06-04 18:35:40 +08:00
faceRollingKB
2020-06-04 18:38:56 +08:00
同域名下的子域名可以,但不同域名的话,一旦你实现了,那就是浏览器漏洞
lululau
2020-06-04 18:39:55 +08:00
第三方 cookie
lululau
2020-06-04 18:52:31 +08:00
思路差不多,但是 ABC 设置的 cookie,aaa 的前端是读不了的,你需要让 ABC 的 server 去告知 aaa 或 bbb (就是当前访问的页面的服务)的 server 当前用户的 cookie 值
amundsen
2020-06-04 19:33:10 +08:00
系统一开始设计成单点登录,就很方便了
Nich0la5
2020-06-04 20:23:59 +08:00
交给后端处理吧
hantsy
2020-06-04 20:30:39 +08:00
Cookie 在浏览器上能够直接跨域就完了谈什么安全性。

不过可以用类似 token 的东西,前端允许不同域名之间传递,后台服务器检测有效性。

在 a 上拿的 token, 转到 b 时链接加上 http://b/?t=token,后台保证它在 a,b 两个域名上都是合法的。
gitjavascript
2020-06-04 20:32:03 +08:00
oss
imdong
2020-06-04 20:37:05 +08:00
<script src="//control.center/load_config.js">

然后所有页面引用这个 js,从这个 js 中获取信息。
jugelizi
2020-06-04 20:52:02 +08:00
哦。第一 你这个可以是 sso
a 域名可以请求 b 域名并通知它种下 cookie

或者向楼上说的 客服号码用公共的第三方接口获取 那么不管哪个网站都是一样的身份
strawberryBug
2020-06-04 21:07:06 +08:00
不同网站的话设置子域名一样就可以了,比如 aaa.nihao.combbb.nihao.com ,把 cookie 加到.nihao.com 就可以实现共享
boshan927
2020-06-04 21:24:20 +08:00
我提供一个思路。

可以使用浏览器指纹( fingerprintjs2.JS )绑定这个浏览器,然后通过是 9 楼的思路,所用页面引用同一个 JS,这个 JS 是用来操作指纹和 cookie 的。大致上就是这样。

不过据说 fingerprintjs2.JS 指纹会有重复的现象。
yuzo555
2020-06-04 21:26:33 +08:00
统一的 API 中心域名就行了吖。。
Tink
2020-06-04 21:59:47 +08:00
sso
ClericPy
2020-06-04 22:21:37 +08:00
这种一般在后端更简单点

前端的话, 别用 Cookie 用 localStorage sessionStorage 试试?
imdong
2020-06-04 22:37:19 +08:00
其实,我写的 //control.center/load_config.js 后端是对应的动态程序。

这个动态程序是可以设置并获取 cookies 的,并且 Cookies 和被放置的网站无关。

假设是 PHP,那么我们大概应该是这样的。

Nginx: rewrite /load_config.js /load_config.php;


```load_config.php
<?php

$wechat_list = ['abc123', 'def456','ghi789'];
$wechat = $_COOKIE['wechat'] ?? null;
if (empty($wechat)) {
$wechat = $wechat_list[array_rand($wechat_list)];
setcookie('wechat', $wechat);
}

printf('var wechat = %s;', $wechat);
```
zarte
2020-06-05 09:46:12 +08:00
sso
另外弄个登录站,登录的时候 js 调登录站的成功后再登录本站或者直接用登录站的登陆信息。
zky001
2020-06-05 09:46:20 +08:00
jwt
lululau
2020-06-05 10:26:38 +08:00
想了想,不需要后端 server 之间的交互, cookie 由 abc.com 种植,a.comabc.com 发送一个请求,abc.com 就能拿到自己域下的 cookie 值,然后 abc.com 对这次请求 redirect 回 a.com ,并且在 redirect location 中附上包含 cookie 值的 query parameter 就可以了
zenzhu
2020-06-05 14:53:18 +08:00
http://subinsb.com/set-same-cookie-on-different-domains/ 用 img set cookie google youtube 都是这么搞的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/678676

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX