
前端是 nodejs 项目,后端是 symfony 项目,前后端域名分别是:a.example.com 和 b.example.com 。 后端有个创建 token 的网址: ttps://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 就为空,这个是怎么回事呢?
1 leeyuzhe 2019-06-19 10:15:01 +08:00 via Android 第一,需要 node 端先获取 cookie 再设置给前端 第二,会话应该由 node 端管理而不是后端管理,node 端跟后端应采用类似 token 的鉴权方式,而不是 cookie 跟 session |
2 ch3nOr 2019-06-19 10:27:13 +08:00 |
3 luzemin 2019-06-19 10:28:24 +08:00 设置 cookie 的 domain 为“.example.com ” |
4 ch3nOr 2019-06-19 10:29:38 +08:00 另外需要注意 Cookie 的作用域,在你的例子里,如果需要 a.example.com 和 b.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 |
6 zuoakang 2019-06-19 11:41:23 +08:00 via Android 二级域名 cookie 共享,要设置 domain 为相同的二级域名,如三楼回复的。 |
7 MrMike OP |
8 ch3nOr 2019-06-19 14:48:37 +08:00 #7 @MrMike 1. 前端请求的 API 的时候,设置 withCredentials 2. 响应的 Header 里面带上 Access-Control-Allow-Credentials: true 做这两件事后再试一试? |
9 Tomorr 2019-06-19 16:56:09 +08:00 同一域名,二级站点共享 Cookie,设置作用域为顶级域名 不同域名,方法也多,常用的是独立的一台服务(如 Redis 等) |
13 welling 2019-06-19 23:12:19 +08:00 node 难道不是后端吗? |