Magento 2 配置了 Share Customer Accounts = Global,同一邮箱可以在多个 Website 登录,但客户从站点 A 跳到站点 B 仍显示未登录。这里容易混淆两个概念:客户账户数据共享与浏览器登录 Session 共享。Global 只表示多个 Website 使用同一个 customer 实体,并不会让两个域名自动拥有同一 Cookie。

先看两个站点是否处于可共享 Cookie 的域范围

shop.example.combrand.example.com 可以在谨慎配置下使用父域 Cookie;example-a.comexample-b.com 无法通过普通 Cookie Domain 直接共享浏览器 Cookie。浏览器的同源和 SameSite 策略会阻止跨无关域名读取。

检查 customer session Cookie 的 Domain、Path、Secure、HttpOnly 和 SameSite。把 Cookie Domain 设得过宽会影响其他子域安全,也可能与后台或旧 Cookie 冲突。

所有节点必须使用同一 Session 存储与加密配置

即使 Cookie 能被两个子域发送,站点 A 与 B 如果连接不同 Redis Session、使用不同 cookie name 或加密密钥,仍无法识别登录状态。确认 app/etc/env.php 的 Session 配置、crypt key 和部署环境一致。

共享 Session 也会把故障域连接起来:一个站点清 Session 可能让全部站点客户退出。应评估容量、隔离与回滚,而不是只追求“看起来像单点登录”。

Store、Website 和客户组上下文仍然不同

客户实体可以共享,但购物车、价格、客户组、地址可用范围和授权逻辑可能按 Website 变化。客户在 B 站登录后,不能默认沿用 A 站的 Quote 和所有权限。跨站共享购物车需要单独业务设计。

不同主域名应使用真正的 SSO

对两个独立域名,安全方案通常是中心身份提供方、一次性授权码或受签名的短期交换流程。不要把 customer_id、邮箱或长期 token 放进 URL。回调必须验证 state、nonce、来源和重放,登录成功后由各站建立自己的 Session。

自定义“自动登录”接口如果接受简单邮箱参数,会导致账户接管。应使用经过验证的 OAuth/OIDC 或等价安全协议,并明确退出登录、密码修改和账户锁定如何同步。

先决定共享的业务边界

用户真正需要的可能只是同一账号密码,而不是无感跨站登录。Global customer scope 已满足前者。后者会引入 Cookie、隐私、购物车和安全复杂度,必须作为单点登录项目设计。

验证时使用两个子域或两个主域,覆盖登录、退出、密码修改、Remember Me、购物车与客户组。任何一个站点退出后,其他站点是否应同时退出,也要在需求中明确并测试。