Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Heroku 未在浏览器中设置会话cookie_Heroku_Cross Domain_Session Cookies_Next.js_Apollo Client - Fatal编程技术网

Heroku 未在浏览器中设置会话cookie

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

我的前端客户端运行在custom Next.js服务器上,该服务器正在使用apollo客户端获取数据。 我的后端是graphql瑜伽,prisma利用express session

我在为我的客户端和后端选择正确的CORS设置时遇到问题,因此cookie将在浏览器中正确设置,尤其是在heroku上

目前,我正在从客户端发送graphql请求,apollo客户端具有选项
凭证:“包括”
,但也尝试了
“相同来源”
,但没有更好的结果

我可以在
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