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.
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.