I am trying to build google user authentication using passport strategy and express session. To authorize a user, I am trying to pass his data using the context. Unfortunately, when I want to use a context in resolver, req.session.passport and req.user disappear for unknown reasons. Did I do something wrong?
Apollo Server v4.
server.ts
import { ApolloServerPluginDrainHttpServer } from "@apollo/server/plugin/drainHttpServer";
import { expressMiddleware } from "@apollo/server/express4";
import { WebSocketServer } from "ws";
import { useServer } from "graphql-ws/lib/use/ws";
import { ApolloServer } from "@apollo/server";
import express from "express";
import http from "http";
import cors from "cors";
import "dotenv/config";
import mongoose from "mongoose";
import { schema, setHttpPlugin } from "./serverSettings/config";
import { json } from "body-parser";
import cookieParser from "cookie-parser";
import passport from "passport";
import authRoutes from "./routes/auth";
import "./services/passport";
import { expressSession } from "./services/session";
//config variables
const port = process.env.PORT;
const host = process.env.HOST;
const dbUri = process.env.DB_URI;
//connect to DB
mongoose
.connect(dbUri)
.then(() => {
console.log("DB connected!");
startApolloServer();
})
.catch((error) => {
console.error(error);
process.exit(1);
});
const startApolloServer = async () => {
const app = express();
const httpServer = http.createServer(app);
const wsServer = new WebSocketServer({
server: httpServer,
path: "/graphql",
});
const serverCleanup = useServer({ schema }, wsServer);
const server = new ApolloServer({
schema,
plugins: [
ApolloServerPluginDrainHttpServer({ httpServer }),
setHttpPlugin,
{
async serverWillStart() {
return {
async drainServer() {
await serverCleanup.dispose();
},
};
},
},
],
});
await server.start();
app.use(expressSession);
app.use(passport.initialize());
app.use(passport.session());
const corsOptions = {
origin: "https://studio.apollographql.com",
credentials: true,
};
app.use(
"/graphql",
// isLoggedIn,
cors<cors.CorsRequest>(corsOptions),
json(),
cookieParser(),
expressMiddleware(server, {
context: async ({ req }: any) => {
// console.log("session --->", req.session);
// console.log("user --->", req.user);
return { req };
},
})
);
//Google Auth
app.get("/", (req, res) => {
res.send('<a href="/auth/google">Auth with Google</a>');
});
app.use("/auth", authRoutes);
//check if user is auth
// function isLoggedIn(req: Request, res: Response, next: NextFunction) {
// req.user ? next() : res.sendStatus(401);
// }
await new Promise<void>((resolve) => httpServer.listen({ port }, resolve));
console.log(` Server ready at ${host}:${port}/graphql`);
};
passport.ts
import { Strategy as GoogleStrategy } from "passport-google-oauth20";
import passport from "passport";
import "dotenv/config";
import Settings from "../models/Settings";
const googleClientId = process.env.GOOGLE_CLIENT_ID;
const googleClientSecret = process.env.GOOGLE_CLIENT_SECRET;
const callbackURL = process.env.GOOGLE_OAUTH_REDIRECT_URL;
passport.serializeUser(function (profile: any, done) {
done(null, profile.id);
});
passport.deserializeUser(function (id: string, done) {
done(null, id);
});
passport.use(
new GoogleStrategy(
{
clientID: googleClientId,
clientSecret: googleClientSecret,
callbackURL,
passReqToCallback: true,
},
async (request, accessToken, refreshToken, profile, done) => {
await Settings.collection.drop();
await new Settings({ refreshToken }).save();
done(null, profile);
}
)
);
session.ts
import session from "express-session";
import MongoStore from "connect-mongo";
import "dotenv/config";
const dbUri = process.env.DB_URI;
const sessionSecret = process.env.SESSION_SECRET;
export const expressSession = session({
name: "mySession",
secret: sessionSecret,
store: MongoStore.create({
mongoUrl: dbUri,
}),
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: true,
maxAge: 1000 * 60 * 60 * 24,
},
});
I will be grateful for your help