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).
- Open Google Cloud Console, search for “Create Project”, and create one.
- Go to OAuth Consent Screen and configure it.
- Create credentials → OAuth Client ID.
- Select Web Application
- Enter redirect URLs (e.g.,
http://localhost:5000/auth/google/callback
) - Save.
- Copy the Client ID and Client Secret.
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
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;
3. Initialize Passport in Express
import express from "express";
import passport from "./passport-config.js";
const app = express();
app.use(passport.initialize());
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;
👉 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,
});
};
🎯 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)