V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
istill
V2EX  ›  Python

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

  •  
  •   istill · 2020-06-04 18:05:25 +08:00 · 8488 次点击
    这是一个创建于 1662 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求场景:有 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,从而达到跨域的目的。

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

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

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

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

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

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

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

    前端的话, 别用 Cookie 用 localStorage sessionStorage 试试?
    imdong
        16
    imdong  
       2020-06-04 22:37:19 +08:00   ❤️ 1
    其实,我写的 //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
        17
    zarte  
       2020-06-05 09:46:12 +08:00
    sso
    另外弄个登录站,登录的时候 js 调登录站的成功后再登录本站或者直接用登录站的登陆信息。
    zky001
        18
    zky001  
       2020-06-05 09:46:20 +08:00
    jwt
    lululau
        19
    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
        20
    zenzhu  
       2020-06-05 14:53:18 +08:00
    http://subinsb.com/set-same-cookie-on-different-domains/ 用 img set cookie google youtube 都是这么搞的
    Shikyou
        21
    Shikyou  
       2020-06-24 16:08:56 +08:00
    像 auth0 和 authing 这一类用户认证云服务,可以快速实现用户跨域登录
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1029 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 18:23 · PVG 02:23 · LAX 10:23 · JFK 13:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.