Search code examples
javascriptreactjstypescriptgoogle-oauth

Error while implementing Google Auth for my website


I'm working on implementing Google Authentication for my website, but encountering the following error related to session management.

TypeError: req.session.regenerate is not a function at SessionManager.logIn (C:\Users\Jayas\node_modules\passport\lib\sessionmanager.js:28:15) at req.login.req.logIn (C:\Users\Jayas\node_modules\passport\lib\http\request.js:39:26) at strategy.success (C:\Users\Jayas\node_modules\passport\lib\middleware\authenticate.js:256:13) at verified (C:\Users\Jayas\node_modules\passport-oauth2\lib\strategy.js:189:20) at Strategy._verify (file:///C:/Users/Jayas/LanguageConnect/languageconnect/server.mjs:91:7) at C:\Users\Jayas\node_modules\passport-oauth2\lib\strategy.js:205:24 at C:\Users\Jayas\node_modules\passport-google-oauth20\lib\strategy.js:122:5 at passBackControl (C:\Users\Jayas\node_modules\oauth\lib\oauth2.js:134:9) at IncomingMessage.<anonymous> (C:\Users\Jayas\node_modules\oauth\lib\oauth2.js:157:7) at IncomingMessage.emit (node:events:525:35)

This is my code,

import passport from "passport";
import GoogleStrategy from "passport-google-oauth20";
import cookieSession from "cookie-session";

const app = express();
const PORT = 8000;

app.use(
  cookieSession({ name: "Session", keys: ["lama"], maxAge: 24 * 60 * 60 * 100 })
);

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

app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

app.get("/auth", passport.authenticate("google", { scope: ["profile"] }));

app.get(
  "/google/auth/callback",
  passport.authenticate("google", {
    successRedirect: "http://localhost:3000/home",
    failureRedirect: "/",
  }),
  function (req, res) {
    console.log("object");
  }
);

passport.use(
  new GoogleStrategy(
    {
      clientID: process.env.CLIENT_ID,
      clientSecret: process.env.CLIENT_SECRET,
      callbackURL: "http://localhost:8000/google/auth/callback",
    },
    function (accessToken, refreshToken, profile, done) {
      done(null, profile);
    }
  )
);

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

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

I had tried GoogleLogin too, but says it is no longer supported. Would appreciate any help, Thanks!


Solution

  • The error message you're seeing is because you're using cookie-session middleware, but passport expects a session to be managed by express-session. You're trying to use a method (req.session.regenerate) that's only available with express-session.

    Replace cookie-session with express-session and it should resolve your issue.

    import session from 'express-session';
    
    app.use(session({
        secret: 'your_secret_key',
        resave: false,
        saveUninitialized: false
    }));