请教个 cookies 共享的问题

2019-06-19 09:40:56 +08:00
 MrMike

前端是 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 就为空,这个是怎么回事呢?

4026 次点击
所在节点    PHP
15 条回复
leeyuzhe
2019-06-19 10:15:01 +08:00
第一,需要 node 端先获取 cookie 再设置给前端
第二,会话应该由 node 端管理而不是后端管理,node 端跟后端应采用类似 token 的鉴权方式,而不是 cookie 跟 session
ch3nOr
2019-06-19 10:27:13 +08:00
luzemin
2019-06-19 10:28:24 +08:00
设置 cookie 的 domain 为“.example.com ”
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
2019-06-19 11:39:42 +08:00
@luzemin 三楼正解
zuoakang
2019-06-19 11:41:23 +08:00
二级域名 cookie 共享,要设置 domain 为相同的二级域名,如三楼回复的。
MrMike
2019-06-19 13:12:47 +08:00
@ritaswc
@zuoakang
@luzemin

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


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

做这两件事后再试一试?
Tomorr
2019-06-19 16:56:09 +08:00
同一域名,二级站点共享 Cookie,设置作用域为顶级域名
不同域名,方法也多,常用的是独立的一台服务(如 Redis 等)
MrMike
2019-06-19 18:32:57 +08:00
@Tomorr 在同一台服务器上,前端是 nodejs,后端是 apache
MrMike
2019-06-19 18:33:36 +08:00
@ch3nOr 我试试。
ritaswc
2019-06-19 19:10:24 +08:00
@MrMike #7 有个什么请求头的,要设置一下 看一下 8 楼的
welling
2019-06-19 23:12:19 +08:00
node 难道不是后端吗?
MrMike
2019-06-20 00:20:20 +08:00
@ch3nOr 可以了。谢了。。。
MrMike
2019-06-20 00:21:30 +08:00
@welling 可以是,我这里说的前端是指界面方面的前端,表述没到位,不好意思。

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

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

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

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

© 2021 V2EX