Файлы cookie, не установленные в браузере при производстве

#express #next.js #passport.js #apollo-server #express-session

Вопрос:

Я использую express.js в качестве сервера и next.js на своем клиенте, на 2 разных серверах.

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

Я использую passport amp; express-session для входа пользователя и создания сеанса, чтобы добавить файл cookie в браузер и сохранить сеанс в базе данных mongodb.

Сервер

В моем файле основного сервера, который запускает сервер, у меня есть следующее. process.env.CLIENT_URL локально возвращает http://localhost:3000 и в производстве возвращает точный URL-адрес клиента, как он есть в производстве, я зарегистрировал его, чтобы убедиться, что он правильный.

 const express = require('express');
const cookieParser = require('cookie-parser');
require('dotenv').config();

// app
const app = express();

// execute database connection
const db = require('./database');

// connect to database
db.connect();

// create session
require('./middlewares').init(app, db);

app.use(express.urlencoded({ extended: true, limit: '5mb' }));
app.use(express.json());
app.use(cookieParser());

const apolloServer = require('./graphql').createApolloServer();

apolloServer.applyMiddleware({
  app,
  cors: { credentials: true, origin: process.env.CLIENT_URL },
});

// port
const port = process.env.PORT || 8000;
const server = app.listen(port, () => {
  console.log(`🚀 Server is running on port ${port}`);
});
 

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

 passport.serializeUser((user, done) => {
  done(null, user.id);
});

passport.deserializeUser((id, done) => {
  User.findById(id, (error, user) => {
    done(error, user);
  });
});

passport.use('graphql', ...);

const sess = {
  name: 'portfolio-session',
  secret: process.env.SESSION_SECRET,
  cookie: { maxAge: 2 * 60 * 60 * 1000 },
  resave: false,
  saveUninitialized: false,
  store: db.initSessionStore(),
};

server.use(session(sess));

server.use(passport.initialize());
server.use(passport.session());
 

Client

For my ApolloProvider I have HOC to add the provider to each page, and here, setting the credentials to include and setting the uri of the server. process.env.BASE_URL locally returns http://localhost:8000 and in production, again I logged it and it is the correct URL, making requests to the server work fine and there are no CORS errors.

 import withApollo from "next-with-apollo";
import ApolloClient, { InMemoryCache } from "apollo-boost";
import { ApolloProvider } from "@apollo/react-hooks";

export default withApollo(
  ({ initialState, headers }) => {
    const uri = process.env.BASE_URL;
    return new ApolloClient({
      request: (operation) => {
        operation.setContext({
          fetchOptions: {
            credentials: "include",
          },
          headers,
        });
      },
      uri,
      cache: new InMemoryCache().restore(initialState || {}),
    });
  },
  {
    render: ({ Page, props }) => {
      return (
        <ApolloProvider client={props.apollo}>
          <Page {...props} />
        </ApolloProvider>
      );
    },
  }
);
 

As I mentioned, works totally fine locally, the cookie gets applied to the browser as expected. Just not in production, I assume I am missing some sort of configuration, but doing some research, I can’t see what?

Any help would be greatly appreciated.