#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.