V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MrMike
V2EX  ›  PHP

请教个 cookies 共享的问题

  •  1
     
  •   MrMike · 2019-06-19 09:40:56 +08:00 · 4030 次点击
    这是一个创建于 2014 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前端是 nodejs 项目,后端是 symfony 项目,前后端域名分别是:a.example.comb.example.com 。 后端有个创建 token 的网址: https://b.example.com/token.html,设置一个共享的 cookie: token。

    public function token()
    {
        $tokenTokenManager = $this->container->get('security.csrf.token_manager');
        $token = $csrfTokenManager->refreshToken($this->tokenName);
    
        $tokenCookie = new Cookie(
            'token',
            $token,
            time() + 3600,
            '/',
            $this->cookieDomain,
            true,
            false
        );
    
        $response = new Response();
        $response->headers->setCookie($tokenCookie);
    
        return $response;
    }
    

    如果单独执行 https://b.example.com/token.html,前端可以获取到 cookie。但是如果通过前端请求这个网址,cookie 就为空,这个是怎么回事呢?

    15 条回复    2019-06-20 00:21:30 +08:00
    leeyuzhe
        1
    leeyuzhe  
       2019-06-19 10:15:01 +08:00 via Android
    第一,需要 node 端先获取 cookie 再设置给前端
    第二,会话应该由 node 端管理而不是后端管理,node 端跟后端应采用类似 token 的鉴权方式,而不是 cookie 跟 session
    luzemin
        3
    luzemin  
       2019-06-19 10:28:24 +08:00
    设置 cookie 的 domain 为“.example.com ”
    ch3nOr
        4
    ch3nOr  
       2019-06-19 10:29:38 +08:00
    另外需要注意 Cookie 的作用域,在你的例子里,如果需要 a.example.comb.example.com 都能用到同一个 Cookie,你需要把 Cookie 的 domain 设置为 .example.com

    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies#Cookie%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F
    ritaswc
        5
    ritaswc  
       2019-06-19 11:39:42 +08:00
    @luzemin 三楼正解
    zuoakang
        6
    zuoakang  
       2019-06-19 11:41:23 +08:00 via Android
    二级域名 cookie 共享,要设置 domain 为相同的二级域名,如三楼回复的。
    MrMike
        7
    MrMike  
    OP
       2019-06-19 13:12:47 +08:00
    @ritaswc
    @zuoakang
    @luzemin

    设置了的,要是前端请求后端的话,后端创建 cookie 的功能无效。但是如果直接访问后端的链接,cookie 创建成功,前端也可以获取到。
    ch3nOr
        8
    ch3nOr  
       2019-06-19 14:48:37 +08:00
    #7 @MrMike


    1. 前端请求的 API 的时候,设置 withCredentials
    2. 响应的 Header 里面带上 Access-Control-Allow-Credentials: true

    做这两件事后再试一试?
    Tomorr
        9
    Tomorr  
       2019-06-19 16:56:09 +08:00
    同一域名,二级站点共享 Cookie,设置作用域为顶级域名
    不同域名,方法也多,常用的是独立的一台服务(如 Redis 等)
    MrMike
        10
    MrMike  
    OP
       2019-06-19 18:32:57 +08:00
    @Tomorr 在同一台服务器上,前端是 nodejs,后端是 apache
    MrMike
        11
    MrMike  
    OP
       2019-06-19 18:33:36 +08:00
    @ch3nOr 我试试。
    ritaswc
        12
    ritaswc  
       2019-06-19 19:10:24 +08:00
    @MrMike #7 有个什么请求头的,要设置一下 看一下 8 楼的
    welling
        13
    welling  
       2019-06-19 23:12:19 +08:00
    node 难道不是后端吗?
    MrMike
        14
    MrMike  
    OP
       2019-06-20 00:20:20 +08:00
    @ch3nOr 可以了。谢了。。。
    MrMike
        15
    MrMike  
    OP
       2019-06-20 00:21:30 +08:00
    @welling 可以是,我这里说的前端是指界面方面的前端,表述没到位,不好意思。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6001 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 02:35 · PVG 10:35 · LAX 18:35 · JFK 21:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.