前端是 nodejs 项目,后端是 symfony 项目,前后端域名分别是:a.example.com 和 b.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 就为空,这个是怎么回事呢?
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 难道不是后端吗?
|