DEV Community

Cover image for Google Login in Express.js using passport.js
Dhiraj Arya
Dhiraj Arya

Posted on

Google Login in Express.js using passport.js

Almost all users have Google accounts, so most websites offer a "Login with Google" feature. It's simple and allows users to log in with just a few clicks.

In this guide, we’ll set up Google authentication in an Express app using Passport.js.


Why choose Passport.js?

There are many options for social login, such as Auth0, Firebase, and Clerk.

But Passport.js is:

  • ✅ Simple and lightweight
  • ✅ Supports multiple strategies (Google, GitHub, Facebook, etc.)
  • ✅ Gives you manual control if needed

That’s why it’s a solid choice.


🚀 Let’s Start

Part 1: Get Google Client ID & Secret

Logging in with Google requires a Client ID and Client Secret (like an office ID card for authentication).

  1. Open Google Cloud Console, search for “Create Project”, and create one.

Google cloud console project creating form page

  1. Go to OAuth Consent Screen and configure it.

Google cloud console oauth consent screen page

  1. Create credentials → OAuth Client ID.
  • Select Web Application
  • Enter redirect URLs (e.g., http://localhost:5000/auth/google/callback)
  • Save.

Google cloud console new client create page

  1. Copy the Client ID and Client Secret.

Google cloud console client created page


Part 2: Setup Express + Passport.js

Now let’s integrate Google authentication into our Express app.

1. Install dependencies

npm install passport passport-google-oauth20
Enter fullscreen mode Exit fullscreen mode

2. Configure Passport strategy (passport-config.js)

import passport from "passport";
import { Strategy as GoogleStrategy } from "passport-google-oauth20";

passport.use(
  new GoogleStrategy(
    {
      clientID: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
      callbackURL: process.env.GOOGLE_CALLBACK_URL,
    },
    function (accessToken, refreshToken, profile, done) {
      return done(null, profile); // return raw profile info
    }
  )
);

export default passport;
Enter fullscreen mode Exit fullscreen mode

3. Initialize Passport in Express

import express from "express";
import passport from "./passport-config.js";

const app = express();
app.use(passport.initialize());
Enter fullscreen mode Exit fullscreen mode

4. Add Routes (auth.routes.js)

import { Router } from "express";
import passport from "passport";
import { googleAuth } from "../controllers/auth.controller.js";

const router = Router();

// Login with Google
router.get(
  "/google",
  passport.authenticate("google", {
    scope: ["profile", "email"],
    session: false,
  })
);

// Google callback
router.get(
  "/google/callback",
  passport.authenticate("google", {
    failureRedirect: "/login",
    session: false,
    failureMessage: "Failed to login with Google",
  }),
  googleAuth
);

export default router;
Enter fullscreen mode Exit fullscreen mode

👉 We set session: false because we’ll use JWT tokens instead of in-memory sessions.

5. Google Auth Controller

export const googleAuth = async (req, res) => {
  const {
    id,
    _json: { name, picture, email },
  } = req.user;

  let user = await userModel.findOne({ googleId: id });

  if (!user) {
    user = await userModel.create({
      name,
      email,
      avatar: picture,
      googleId: id,
    });
  }

  // Generate tokens
  const { accessToken, refreshToken } = await generateToken(user);

  return res
    .status(200)
    .cookie("accessToken", accessToken, cookiesOptions)
    .cookie("refreshToken", refreshToken, cookiesOptions)
    .json({
      success: true,
      message: "User login successful",
      user,
      accessToken,
    });
};
Enter fullscreen mode Exit fullscreen mode

🎯 Conclusion

That’s it! 🚀 You now have Google authentication working with Express and Passport.js.

✅ Google OAuth setup in Cloud Console
✅ Passport strategy configured
✅ Express routes + controller created
✅ JWT tokens for authentication

Next step: Secure routes and refresh tokens.

Top comments (0)