我无法理解为什么我的(会话)cookie不会被设置在客户端。devtools上显示的错误如下:
通过Set-Cookie标头设置Cookie的尝试被阻止,因为其Domain属性对于当前主机URL无效。
我做了一些研究,原来这是一个域的问题,因为前端(Firebase)和后端(云运行)是在不同的域名。
令我不安的是,当我的前端在本地主机上运行时,这个问题不会出现(即使后端仍然是远程的,在云上运行)。
以下是我配置会话的方法:
app.set('trust proxy', 1);
app.use(json());
app.use(
session({
name: '__session',
store: new RedisStore({ client: redisClient }),
secret: options.sessionSecret,
resave: false,
saveUninitialized: false,
cookie: {
secure: process.env.NODE_ENV === 'PROD' ? true : 'auto',
httpOnly: true,
maxAge: 1000 * 60 * 60 * 24 * 7,
sameSite: process.env.NODE_ENV === 'PROD' ? 'none' : 'lax',
domain: '<FRONTEND_URL>',
},
})
);
我觉得domain
属性不正确,但我提供了前端域、后端域和后端的根域(run.app
)
我是不是漏掉了什么?还是误解了什么?
EDIT:
正如您所看到的,Secure; SameSite=None
在cookie中提供。
1条答案
按热度按时间41zrol4v1#
不能使用
run.app
和a.run.app
,因为它们包含在Mozilla基金会的Public Suffix List中。Heroku文档中有great article about this issue。要解决此问题,您可以:
1.在你的应用上设置自定义域。比如
client.example.com
和api.example.com
。1.在一个Cloud Run示例中部署客户端和API。
1.使用不同的身份验证策略,如令牌身份验证。客户端根据令牌交换凭据并将其存储在浏览器本地存储中。然后,客户端在每次请求时发送令牌。
希望能有所帮助!