Heroku 未在浏览器中设置会话cookie
我的前端客户端运行在custom Next.js服务器上,该服务器正在使用apollo客户端获取数据。 我的后端是graphql瑜伽,prisma利用express session 我在为我的客户端和后端选择正确的CORS设置时遇到问题,因此cookie将在浏览器中正确设置,尤其是在heroku上 目前,我正在从客户端发送graphql请求,apollo客户端具有选项Heroku 未在浏览器中设置会话cookie,heroku,cross-domain,session-cookies,next.js,apollo-client,Heroku,Cross Domain,Session Cookies,Next.js,Apollo Client,我的前端客户端运行在custom Next.js服务器上,该服务器正在使用apollo客户端获取数据。 我的后端是graphql瑜伽,prisma利用express session 我在为我的客户端和后端选择正确的CORS设置时遇到问题,因此cookie将在浏览器中正确设置,尤其是在heroku上 目前,我正在从客户端发送graphql请求,apollo客户端具有选项 凭证:“包括”,但也尝试了“相同来源”,但没有更好的结果 我可以在Set cookie标题和devTools/applicati
凭证:“包括”
,但也尝试了“相同来源”
,但没有更好的结果
我可以在Set cookie
标题和devTools/application/cookies中看到来自后端的cookie客户端响应。但此cookie对浏览器是透明的,并且在刷新时丢失
说到这里,我还尝试将一些售后软件作为apollo客户端
实现为apolloLink
,以拦截来自response.headers的cookie,但它是空的
到目前为止,我正在考虑寻求这两条解决问题的途径
(我之所以实现CORS,是因为浏览器阻止在没有CORS的情况下获取数据。)
客户
客户端的客户端配置:
const httpLink = new HttpLink({
credentials: "include",
uri: BACKEND_ENDPOINT,
});
客户端CORS使用和配置:
app
.prepare()
.then(() => {
const server = express()
.use(cors(corsOptions))
.options("*", cors(corsOptions))
.set("trust proxy", 1);
...here goes rest of implementation
My atempt从Apollo客户端的响应中获取标题(但标题为空,之后不会获取数据):
后端
CORS实现(请记住这是gql瑜伽,所以我需要首先从中暴露express)
会话设置,存储为连接redis
server.express
.use(
session({
store: store,
genid: () => uuidv4(v4options),
name: process.env.SESSION_NAME,
secret: process.env.SESSION_SECRET,
resave: true,
rolling: true,
saveUninitialized: false,
sameSite: false,
proxy: STAGE,
unset: "destroy",
cookie: {
httpOnly: true,
path: "/",
secure: STAGE,
maxAge: STAGE ? TTL_PROD : TTL_DEV
}
})
)
我希望在身份验证后在客户端上设置会话cookie
实际结果:
Cookie仅在Set-Cookie响应标头中可见,但对浏览器是透明的,不会持久或设置(在刷新或页面更改时丢失)。有趣的是,我仍然可以对数据进行身份验证请求。这可能不是CORS问题,看起来像是第三方cookie问题
不同浏览器的行为可能不同,因此我建议测试几个浏览器。Firefox(从77版开始)似乎没有那么严格。在Chrome(从83版开始)中,当第三方cookie被阻止时,URL栏的最右侧有一个指示器。您可以通过为当前网站创建异常来确认第三方cookie是否是问题的原因
假设您当前的设置如下所示:
frontend.com
backend.herokuapp.com
为后端使用自定义域(即前端的子域)可以解决您的问题:
frontend.com
api.frontend.com
下面的设置不起作用,因为< Mozilla基金会的公共后缀列表中包含<>代码> HeloUppApp.COM>代码>:
frontend.herokuapp.com
backend.herokuapp.com
.你解决了这个问题吗?遗憾的是,没有-出于这个愚蠢的原因,我们从next.js切换到cra。我通过在heroku的前端和后端使用自定义域成功地解决了这个问题
server.express
.use(
session({
store: store,
genid: () => uuidv4(v4options),
name: process.env.SESSION_NAME,
secret: process.env.SESSION_SECRET,
resave: true,
rolling: true,
saveUninitialized: false,
sameSite: false,
proxy: STAGE,
unset: "destroy",
cookie: {
httpOnly: true,
path: "/",
secure: STAGE,
maxAge: STAGE ? TTL_PROD : TTL_DEV
}
})
)
frontend.com
backend.herokuapp.com
frontend.com
api.frontend.com
frontend.herokuapp.com
backend.herokuapp.com