Skip to Content
Documentation
Starter kits
Get Pro
Introduction
Installation

Supabase Authentication

Configure the Supabase authentication service

Supabase is an open source Firebase alternative that provides a Postgres database, authentication, and real-time data sync.

You can access the supabase branch of the Next.js Starter Kit to see the complete code for this example.

Install

Install the Supabase auth service in the Next.js app.

yarn workspace web add @acme/auth-supabase

Configure

Edit apps/web/.env and add your public Supabase URL and KEY. You can find your project URL and KEY in the Supabase console.

NEXT_PUBLIC_SUPABASE_URL="https://x.supabase.co"
NEXT_PUBLIC_SUPABASE_KEY="x"

Setup

Edit apps/web/features/auth/auth-service and create the supabase authentication service.

import {
  createAuthService,
  createSupabaseBrowserClient,
} from '@acme/auth-supabase/client'

export const supabase = createSupabaseBrowserClient()

export const authService = createAuthService(supabase, {
  loginOptions: {
    redirectTo: '/auth/callback',
  },
  signupOptions: {
    emailRedirectTo: '/auth/callback',
  },
})

Update the next.js Middleware apps/web/middleware.ts to use the Supabase authentication service.

import { NextResponse } from 'next/server'

import { auth } from '@acme/auth-supabase/middleware'

const publicRoutes = [
  '/login',
  '/signup',
  '/forgot-password',
  '/reset-password',
]

export default auth((req) => {
  if (!req.auth && !publicRoutes.includes(req.nextUrl.pathname)) {
    const redirectTo = new URL(req.nextUrl.pathname, req.nextUrl.origin)
    const newUrl = new URL('/login', req.nextUrl.origin)
    newUrl.searchParams.set('redirectTo', redirectTo.toString())
    return NextResponse.redirect(newUrl)
  }

  return NextResponse.next()
})

Replace all getSession imports with the getSession from @acme/auth-supabase in the following files:

  • apps/web/app/(app)/layout.tsx
  • apps/web/app/api/trpc/[trpc]/route.ts
  • apps/web/lib/trpc/rsc.ts

If you have any other files that use getSession you will need to replace them as well.

import { getSession } from '@acme/auth-supabase'

If you previously used another auth service, like Better Auth, you can also remove the drizzle schema from packages/db/drizzle.config.ts.

Now your app is configured to use Supabase authentication.

Try it out by running yarn dev:web and navigating to http://localhost:3000.

Additional resources

If you need access to auth.users table of Supabase, you can use the Supabase utilities from drizzle-orm/supabase.

import { authUsers } from 'drizzle-orm/supabase'

More information here: drizzle-orm/supabase

Drizzle also supports Row-level security (RLS), which allows you to configure policies and roles for accessing data in your database.

Next steps

Supabase Authentication | Saas UI