oRPC Better Auth Integration

Use Better Auth inside your oRPC projects without any extra overhead.

SKILL.md

GitHub

Better Auth Integration

Better Auth is a framework-agnostic, universal authentication and authorization framework for TypeScript.

Step 1: Define Context Headers

Access request headers in your context — manually or via the Request Headers Plugin.

Option A: Manual

import { os } from '@orpc/server'

export const base = os.$context<{ headers: Headers }>()

Option B: Request Headers Plugin

Use the plugin's setup.

Step 2: Create Auth Middleware

import { auth } from './auth' // Your Better Auth instance
import { base } from './context'
import { ORPCError } from '@orpc/server'

export const authMiddleware = base.middleware(async ({ context, next }) => {
  const sessionData = await auth.api.getSession({
    headers: context.headers,
  })

  if (!sessionData?.session || !sessionData?.user) {
    throw new ORPCError('UNAUTHORIZED')
  }

  return next({
    context: {
      session: sessionData.session,
      user: sessionData.user
    },
  })
})

Usage

Create an authorized base that includes the auth middleware:

import { base } from './context'
import { authMiddleware } from './middlewares/auth'

export const authorized = base.use(authMiddleware)

Now use it to create authenticated procedures:

import { authorized } from './authorized'

export const getMessages = authorized.handler(({ context }) => {
  // context.session and context.user are guaranteed to be defined
})