Экспресс-соединение файлов cookie / узла.sid отсутствует на клиенте в рабочей среде (Heroku), хотя виден на локальном хосте

#javascript #node.js #heroku #cookies #graphql

#javascript #node.js #heroku #файлы cookie #graphql

Вопрос:

У меня есть приложение React, которое развернуто в Netlify, и серверная часть GraphQL / express, развернутая на Heroku.

Я использую файл connect.sid cookie на сервере для сохранения входа в систему и обработки других внутренних запросов, например, платежей stripe. Файл cookie создается в моей локальной среде разработки; однако в рабочей среде (сервер postgres db, развернутый на Heroku клиент, развернутый на Netlify) файл connect.sid cookie не отправляется обратно клиенту.

Однако при просмотре журналов Heroku я могу сказать, что файл cookie генерируется. Он просто не может быть использован или виден клиентом.

Вот мой сервер узла:

 const startServer = async () => {
  if (typeOrmOptions.url) {
    await createConnection(typeOrmOptions); // --> was this before
  } else {
    await createConnection(); // --> was this before
  }

  const server = new ApolloServer({
    typeDefs,
    resolvers,
    context: ({ req }: any) => ({ req }),
    introspection: true,
    playground: true
  });

  const app = express();

  const forceSsl = function(req, res, next) {
    if (req.headers["x-forwarded-proto"] !== "https") {
      return res.redirect(["https://", req.get("Host"), req.url].join(""));
    }
    return next();
  };

  app.use(forceSsl);

  app.set("trust proxy", 1);

  app.use(
    session({
      resave: false,
      saveUninitialized: false,
      cookie: {
        maxAge: 86400000,
        domain
      },
      store: new MemoryStore({
        checkPeriod: 86400000 // prune expired entries every 24h
      }),
      secret: "keyboard cat"
    })
  );

  server.applyMiddleware({
    app,
    cors: {
      origin: webUrl,
      credentials: true
    }
  });

  app.listen({ port: port }, () =>
    console.log(
      `🚀 Server ready at http://localhost:${port}${server.graphqlPath}, weburl = ${webUrl}`
    )
  );
};

startServer();
 

Вот клиент React

 const serverUrl =
  process.env.NODE_ENV === "development"
    ? "http://localhost:4000"
    : "https://server-domain.com";

const client = new ApolloClient({
  uri: `${serverUrl}/graphql`,
  credentials: "include"
});

function App() {
  console.log(serverUrl, "uri");
  return (
    <ApolloProvider client={client}>
      <ThemeProvider theme={theme}>
        <Routes/>
      </ThemeProvider>
    </ApolloProvider>
  );
}

export default App;
 
  • Вывод сети на локальном хосте
  • Вывод файла cookie на локальном хосте
  • Вывод сети в рабочей среде
  • Вывод файла cookie (или его отсутствие) в рабочей среде
  • Вывод консоли в рабочей среде
  • Вывод журнала Heroku

Как вы можете видеть, сеансы регистрируются на стороне сервера … они просто не доходят до клиента.

Бьюсь головой о стену — буду признателен за любую помощь!

Любые предложения о том, как это исправить?