NextAuth Google: Code Examples Galore

published on 06 December 2023

Most developers would agree that implementing Google authentication with NextAuth.js can be challenging at first.

But with the right guidance, you can seamlessly integrate the power of Google login into your Next.js applications using NextAuth.

This post dives into code examples galore demonstrating how to leverage NextAuth.js to enable smooth and secure Google authentication flows in your apps.

Embracing NextAuth Google Integration: A Primer

Integrating Google authentication into your Next.js application can streamline the login experience for users. The open-source NextAuth.js provides an easy way to add Google OAuth along with other major providers.

Let's walk through key steps for setting up NextAuth with Google, including registering your app, configuring providers, designing login pages, and handling callbacks. We'll look at code examples for implementing best practices at each stage.

Initiating the Google API Journey

To start, you'll need to register your Next.js app in the Google Cloud Platform. This generates the API credentials required for NextAuth to authenticate users.

Here are the steps:

  1. Create a Google Cloud Platform project
  2. Enable the Google+ API under Library
  3. Under Credentials, create an OAuth Client ID
    • Application Type: Web Application
    • Add authorized URLs for redirect callbacks
  4. Note down the Client ID and Secret

With API keys in hand, pass them to the NextAuth Google provider:

providers: [
  GoogleProvider({
    clientId: process.env.GOOGLE_ID,
    clientSecret: process.env.GOOGLE_SECRET
  })
]

Deploying Next-auth/providers for Google

Install the Google provider package:

npm install @next-auth/google-oauth2

Then import and initialize in pages/api/auth/[...nextauth].js:

import Providers from `next-auth/providers`
import GoogleProvider from "@next-auth/google-oauth2"

export default NextAuth({
  providers: [
    Providers.Google({
      clientId: process.env.GOOGLE_ID,
      clientSecret: process.env.GOOGLE_SECRET
    })
  ]
})

Crafting the Google Sign-In Experience

With providers configured, adding a Google login button is straightforward:

import { signIn } from "next-auth/react"

function LoginButton() {
  return (
    <button onClick={() => signIn('google')}>
      Sign in with Google
    </button>
  )
}

The signIn handler initializes the OAuth flow behind the scenes when clicked.

NextAuth Callbacks: Tailoring the Redirects

We need to specify callback URLs that Google redirects users to after authenticating.

Under Client IDs in Google Cloud, add:

http://localhost:3000/api/auth/callback/google

Do the same for production URLs.

Additionally, pass a callback path in NextAuth options:

callbacks: {
  async signIn({ user, account, profile, email, credentials }) {
    return true
  }
}

Merging Accounts: Google Meets Existing Users

When an existing user logs in with Google, we may want to link accounts rather than create a separate profile.

The signIn callback helps handle this:

async signIn({ user, account, profile, email, credentials }) {

  if (user) {
    // User is logged in already, link accounts
    return true 
  } else {
    // User is new, create account
    return true
  }

}

The example above demonstrates core concepts for adding Google login with NextAuth.js. With API keys configured and providers initialized, crafting the sign-in flow is straightforward. Callbacks and account linking allow further customization for a streamlined user experience.

What is the use of NextAuth?

NextAuth.js is an open-source authentication library for Next.js applications. It allows developers to easily integrate various social providers like Google, Facebook, Twitter, GitHub, and more for handling user authentication in their apps.

Some of the key benefits of using NextAuth include:

Secure and Standardized Authentication Flow

NextAuth handles the entire authentication process securely by following industry standards and best practices like OAuth 2.0 and OpenID Connect. This saves developers time from building custom solutions and reduces the risk of vulnerabilities.

Supports Passwordless Authentication

In addition to social providers, NextAuth has built-in support for passwordless sign-in using email magic links or SMS codes. This improves the signup experience for users without needing passwords.

Database Integration

NextAuth can integrate with SQL and NoSQL databases out-of-the-box to persist user accounts and session data. Popular databases like PostgreSQL, MySQL, MongoDB etc. have adapters ready to use.

Easy to Customize and Extend

The library is designed to be modular and extensible. Developers can tweak the authentication flow, UI, session handling as per their app's needs by using the hook system. Adding custom providers is straightforward too.

Handles Session Management

Sessions, cookies, token refresh handling is taken care automatically by NextAuth. Developers don't need to worry about these implementation details.

Supports Next.js 12+

NextAuth is fully compatible with the latest Next.js 12+ features like middleware and is designed specifically for API routes.

In summary, NextAuth takes care of the entire auth system, from provider integration to session management, allowing developers to focus on building application features. Its flexibility makes it a great choice for adding authentication to Next.js projects.

What companies use NextAuth?

NextAuth.js is an open-source authentication library for Next.js applications that has quickly gained popularity among developers. Many high-traffic websites leverage NextAuth to handle user login and account management in their apps built with Next.js.

Here are some of the top companies using NextAuth in production:

OpenAI

OpenAI built their public website openai.com using Next.js and rely on NextAuth for authentication. With over 86% of global internet users visiting OpenAI's website monthly, it sees incredibly high traffic volumes. Implementing NextAuth likely helped them scale while securing access to private demo features.

10015.io

10015.io is a software company providing AI solutions for business leaders. Their site built with Next.js utilizes NextAuth to manage account logins. Around 2% of all internet users browse 10015.io each month.

Leonardo

Leonardo offers an AI assistant for sales professionals. They use NextAuth in their Next.js apps for account management and restricting access to advanced features. About 1% of internet users visit Leonardo monthly.

Reworkd.ai

Reworkd.ai built an AI writing assistant to generate marketing copy using Next.js and NextAuth. With about 0.4% of global internet traffic, they likely manage thousands of active user accounts with NextAuth.

This short sample of companies with sites powered by Next.js demonstrates NextAuth's impressive reach. The open-source library streamlines adding authentication providers like Google, GitHub, Facebook, and more. Any developer building web apps with Next.js can integrate NextAuth to handle user accounts. With intuitive configuration and callbacks, it accelerates development while offering production-ready security.

sbb-itb-5683811

How do I find my Google client ID and secret for NextAuth?

To use Google authentication with NextAuth.js, you will first need to obtain a client ID and secret from the Google Developer Console. This process can seem complicated at first, but we'll break it down step-by-step below.

1. Create a Google Cloud Platform project

  • Go to the Google Cloud Console and create a new project.
  • Name the project something relevant like "My NextAuth App".

2. Enable the Google+ API

  • From the project dashboard, go to "APIs & Services" then "Library".
  • Search for "Google+ API" and enable it.

3. Configure the authorized redirect URI

  • From the left menu go to "OAuth consent screen".
  • Add an authorized redirect URI. We set this URL to https://localhost:3000/api/auth/callback/google.
  • This URL will invoke the yet-to-be-defined API route in the Next.js app.

4. Get the client ID and secret

Once the above steps are done, go to "Credentials" and click "+ Create credentials".

  • Select "OAuth client ID".
  • Select "Web application" application type.
  • Enter a name like "NextAuth Google Auth".
  • Authorized redirect URI should be https://localhost:3000/api/auth/callback/google.

Click save and you will get your client ID and secret keys:

Client ID: 
789012-abcde1f2g3hij4k5lmnop6qr.apps.googleusercontent.com

Client Secret:  
stB1cD2efGhiJkLMNopQ

And that's it! Use these credentials when configuring the NextAuth.js Google provider.

Let me know if any part of this process is confusing! Setting up the Google credentials can be tricky but is necessary to enable Google login with NextAuth.

How to implement Google login in nextjs?

Implementing Google login in Next.js applications can be easily achieved using the NextAuth.js authentication library.

To get started, you'll need to:

Set Up Google OAuth Credentials

First, go to the Google Developer Console and create a new OAuth client ID. Make sure to configure the authorized redirect URIs to match your Next.js application's callback endpoint.

Install Dependencies

Next, install the required dependencies:

npm install next-auth @next-auth/google-oauth2

This will pull in NextAuth.js along with the Google OAuth2 provider.

Implement the OAuth Login Flow

In your Next.js pages API route, import NextAuth and configure the Google provider:

import NextAuth from "next-auth"
import GoogleProvider from "next-auth/providers/google"

export default NextAuth({
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_ID,
      clientSecret: process.env.GOOGLE_SECRET
    })
  ]
})

Then in your app pages, use the signin() method to trigger the Google login flow:

import { signIn } from "next-auth/react"

function LoginButton() {
  return <button onClick={() => signIn('google')}>Login with Google</button> 
}

Configure Callbacks

Finally, implement callback functions to handle logging in users once authenticated with Google:

callbacks: {
  async signIn(user, account, profile) { 
    return true
  } 
}

This signs in users after Google redirects back.

And that's it! By leveraging NextAuth.js, adding Google login is quick and painless. The library handles the OAuth flow, serialization, and more out of the box.

Advanced Topics in NextAuth Google Integration

Beyond basic setup - advanced topics like scopes, tokens, profiles etc. Code examples for customization.

Expanding Reach: Google API Scope Requests

When integrating Google authentication with NextAuth.js, we can request additional OAuth scopes beyond the default profile and email scopes. This allows us to access more Google APIs on behalf of the user.

Some useful scopes to request:

  • https://www.googleapis.com/auth/drive.readonly: Read access to Google Drive files
  • https://www.googleapis.com/auth/calendar.readonly: Read-only access to the user's Google Calendar
  • https://www.googleapis.com/auth/youtube.readonly: View YouTube data

To request additional scopes, pass them in the scope parameter when configuring the Google provider:

Providers.Google({
  clientId: process.env.GOOGLE_ID,
  clientSecret: process.env.GOOGLE_SECRET,
  authorization: {
    params: {
      scope: 'https://www.googleapis.com/auth/drive.readonly https://www.googleapis.com/auth/calendar.readonly',
    },
  },
})

With additional scopes granted, we can now access more Google APIs on behalf of the logged-in user!

Mastering Google ID Tokens

When a user logs in with Google via NextAuth.js, an ID token is returned containing user profile information.

We can access the raw ID token in our session callback function:

callbacks: {
  async jwt(token, user) {
    // Get ID token
    const idToken = user?.idToken

    // Decode token 
    const decodedToken = jwtDecode(idToken)
    
    // Log decoded claims
    console.log(decodedToken)

    return token
  }  
}

The ID token contains useful claims about the user like name, email, profile ID and more. We can use these claims to customize our app's user experience.

Tailoring Google User Profiles

We may want to customize the user profile data returned by Google authentication.

For example, to include the user's Google Profile ID:

callbacks: {
  async jwt(token, user) {
    // Add custom field to profile
    if (user) {
      token.userProfileId = user.id
    }
    return token
  },

  async session(session, token) {
    // Append profile ID to session
    session.user.profileId = token.userProfileId 
    return session
  }
}

Now our user sessions contain the Google Profile ID, allowing us to identify users uniquely.

When users grant access to sensitive scopes, we should explain why access is needed through a custom consent screen.

To add a consent screen:

callbacks: {
  async signIn({ user, account, profile, email, credentials }) {

    if (account.provider === "google" && profile.grantedScopes.includes("drive.readonly")) {
      // Show custom drive access confirmation dialog
      return await confirmGoogleDriveAccess(user) 
    }

    return true
  }
}

If the user grants consent, we allow sign-in to proceed. Otherwise, we can return false to block access.

Debugging Deep Dive: OAuth Flow and NextAuth

Debugging Google authentication can be tricky. Here are some tips:

  • Check for errors on the Google OAuth consent screen
  • Log the authorization request parameters
  • Verify OAuth credentials and parameters
  • Print each NextAuth.js callback execution

For example:

providers: [
  Providers.Google({
    clientId: process.env.GOOGLE_ID, 
    clientSecret: process.env.GOOGLE_SECRET,
    authorization: {
      params: {
        scope: 'https://www.googleapis.com/auth/drive.readonly' 
      },
    },
  }),
],
callbacks: {
  async signIn({ user, account, profile, credentials }) {
    console.log("Sign in callback called")
    // ...
  }, 

  async session(session, token) {
    console.log("Session callback called")
    // ...
  },

  async jwt(token, user, account, profile, isNewUser) {
    console.log("Jwt callback called")
    // ...
  }
}

By printing each callback execution during debugging, we can isolate issues in the OAuth authorization flow.

Securing Success with NextAuth Google Best Practices

Recommendations for production-ready authentication with Google OAuth. Security, UX, customization best practices.

Safeguarding Production Credentials

When implementing Google authentication with NextAuth in production, it's critical to keep your credentials secure. Here are some tips:

  • Use environment variables to store sensitive keys rather than hardcoding them. For example:
NEXTAUTH_GOOGLE_CLIENT_ID=${process.env.GOOGLE_CLIENT_ID}
NEXTAUTH_GOOGLE_CLIENT_SECRET=${process.env.GOOGLE_CLIENT_SECRET} 
  • Leverage secret management services like Vercel or AWS Secrets Manager to securely store environment variables.

  • Enable HTTPS on your production environment for transport security.

  • Follow OAuth best practices like validating redirect URIs on the Google Cloud console.

  • Frequently rotate client secrets to limit exposure.

Properly managing credentials will ensure your NextAuth Google integration remains secure as your app scales.

Enhancing the Google Login Flow

A seamless login flow improves user experience with Google OAuth authentication:

  • Customize the Consent Screen with your app name, logo, and purpose for transparency.

  • Set up suitable OAuth scopes to only request necessary user data. Avoid overfetching.

  • Use NextAuth callbacks to preprocess data, enrich user profiles, and handle errors gracefully.

  • Display pending requests, loaders, and error messages during redirects to indicate status.

  • Save recently used Google accounts to streamline re-authentication.

With some UX-centric customizations, you can craft an intuitive Google login that delights users.

Transitioning with Ease: NextAuth Upgrades

When upgrading major NextAuth versions, follow these steps to smoothly transition:

  • Review changelog and migration guide thoroughly for breaking changes.

  • Create a fresh NextAuth configuration file side-by-side with your existing one.

  • Methodically transfer providers, callbacks, theme, and customization from old to new config.

  • Test extensively and fix compilation issues before replacing old config.

  • Remove legacy NextAuth imports/exports last after confirming functionality.

With a systematic approach, transitioning authentication logic through NextAuth upgrades can be straightforward.

Augmenting Google with Custom Next-auth/providers

For more flexibility, you can pair Google OAuth with custom auth providers using next-auth/providers.

Some examples:

  • Email password authentication:

    Providers.Email({
       server: process.env.EMAIL_SERVER,
       from: process.env.EMAIL_FROM,
    })
    
  • JWT token authentication:

     Providers.JWT({
       secret: 'secret123' 
     })
    
  • External API authentication:

    Providers.External({
      id: 'example-api',
      name: 'Example API',
      // Additional provider implementation
    })
    

Mixing Google OAuth with other auth methods allows supporting diverse login options in your app.

The Final Callback: Summarizing NextAuth Google

Configuring NextAuth with Google OAuth delivers simplified authentication powered by Google's infrastructure. With environment variable secrets management, UX-centric customization, structured upgrades, and custom provider extensibility, you can build secure, production-ready login flows. Follow the recommendations covered to ensure your NextAuth Google integration meets the demands of real-world applications.

Related posts

Read more

Make your website with
Unicorn Platform Badge icon