mcpField
B
better-auth

better-auth

github.com/oakossSecurity20106 installsUpdated 11w ago
Repository

About better-auth

better-auth is an authentication library and setup reference for developers integrating authentication into applications. It covers sessions, database configuration, and plugins for password, social, and other authentication methods.

Key features

  1. 01Password and social sign-in configuration
  2. 02Multiple session strategies
  3. 03Plugins for organizations and two-factor auth
  4. 04Database adapter and configuration guidance
  5. 05Migration and troubleshooting references

Use cases

  1. 01Configure password or social authentication
  2. 02Add organization management or two-factor authentication
  3. 03Troubleshoot session, database, or OAuth issues

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/oakoss/agent-skills --skill better-auth

After installing, type/better-authin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
configuration.md
database-adapters.md
email-password.md
frameworks.md
migration-guides.md
organizations.md
plugins.md
sessions.md
troubleshooting.md
two-factor.md

Details

From the project README

better-auth

Package: [email protected] (ESM-only since v1.4.0) Docs: https://better-auth.com/docs | GitHub: https://github.com/better-auth/better-auth

Environment Setup

VariablePurpose
BETTER_AUTH_SECRETEncryption secret (min 32 chars). Generate: openssl rand -base64 32
BETTER_AUTH_URLBase URL (e.g., https://example.com)

Only define baseURL/secret in config if env vars are NOT set. CLI looks for auth.ts in: ./, ./lib, ./utils, or ./src.

Core Config Options

OptionNotes
appNameOptional display name
baseURLOnly if BETTER_AUTH_URL not set
basePathDefault /api/auth. Set / for root.
secretOnly if BETTER_AUTH_SECRET not set
databaseRequired unless using stateless mode (v1.4+)
secondaryStorageRedis/KV for sessions and rate limits
emailAndPassword{ enabled: true } to activate
socialProviders{ google: { clientId, clientSecret }, ... }
pluginsArray of plugins
trustedOriginsCSRF whitelist

Plugin Reference

PluginDescription
twoFactorTOTP, email OTP, backup codes
organizationMulti-tenant orgs, teams, invitations, RBAC
adminUser management, impersonation, banning
passkeyWebAuthn passwordless login
magicLinkEmail-based passwordless login
jwtJWT tokens with key rotation, JWKS
oauthProviderBuild your own OAuth 2.1 provider (separate @better-auth/oauth-provider package)
ssoEnterprise SSO with OIDC, OAuth2, SAML 2.0 (separate @better-auth/sso package)
scimEnterprise user provisioning (separate @better-auth/scim package)
stripePayment and subscription management
bearerAPI token auth for mobile/CLI
apiKeyToken-based auth with rate limits
oneTapGoogle One Tap frictionless sign-in
anonymousGuest user access without PII
genericOAuthCustom OAuth providers with PKCE
emailOTPEmail-based one-time password auth
phoneNumberPhone/SMS-based OTP sign-in
usernameUsername-based sign-in (alternative to email)
multiSessionMultiple accounts in same browser
openAPIInteractive API docs at /api/auth/reference

Session Strategies

StrategyFormatUse Case
Compact (default)Base64url + HMAC-SHA256Smallest, fastest
JWTStandard JWTInteroperable
JWEA256CBC-HS512 encryptedMost secure

Getting Started

For new projects or first-time Better Auth setup, use the official interactive setup skill:

npx skills add better-auth/skills -s create-auth-skill

This walks through framework detection, database selection, auth method choices, plugin setup, and generates the initial configuration.

Anti-Patterns

Anti-PatternCorrect Approach
Using d1AdapterUse Drizzle or Kysely adapter with provider: "sqlite"
Using table name in configUse ORM model name, not DB table name
Forgetting CLI after plugin changesRe-run npx @better-auth/cli@latest generate
tanstackStartCookies() not last pluginMust be the last plugin in array (TanStack Start)
Checking session for login stateCheck session?.user — session object is always truthy
Missing nodejs_compat flagRequired in wrangler.toml for Cloudflare Workers
Kysely CamelCasePlugin with authUse separate Kysely instance without the plugin
Using old reactStartCookies importRenamed to tanstackStartCookies from better-auth/tanstack-start in v1.4.14

Common Mistakes

MistakeCorrect Pattern
Setting baseURL and secret in config when env vars are already setOnly define these in config if BETTER_AUTH_URL and BETTER_AUTH_SECRET env vars are NOT set
Using CommonJS require syntax with better-auth v1.4+better-auth is ESM-only since v1.4.0; use import syntax exclusively
Not re-running CLI generate after adding or changing pluginsAlways run npx @better-auth/cli@latest generate after plugin changes to update DB schema
Checking session object truthy state for login detectionCheck session?.user instead; the session object itself is always truthy
Using d1Adapter directly for Cloudflare D1Use Drizzle or Kysely adapter with provider: "sqlite" for D1 compatibility

Breaking Changes

VersionChange
v1.4.14reactStartCookies renamed to tanstackStartCookies (import from better-auth/tanstack-start)
v1.4.6allowImpersonatingAdmins defaults to false
v1.4.0ESM-only (no CommonJS); SSO, SCIM, OAuth Provider moved to separate packages
v1.3.0Multi-team table structure: new teamMembers table needed

Delegation

When working on auth, delegate to:

  • application-security — Security architecture and threat modeling
  • database — Drizzle ORM schema and migrations
  • tanstack-start — TanStack Start integration patterns

Resources

References

  • Database Adapters — Drizzle, Kysely, Prisma adapters, Cloudflare Workers factory pattern
  • Session Management — Cookie cache, stateless sessions, storage priority, freshAge constraints
  • Plugins and Social Auth — Plugin setup, OAuth 2.1 provider, admin RBAC, social provider scopes
  • Email and Password — Verification, password reset, timing attack prevention, hashing (scrypt, argon2), token security
  • Two-Factor Authentication — TOTP, email/SMS OTP, backup codes, trusted devices, 2FA session flow
  • Organizations — Multi-tenant orgs, teams, invitations, RBAC, dynamic access control, lifecycle hooks
  • Configuration — User/account config, rate limiting, hooks, CSRF, trusted origins, cookie/OAuth security, production checklist
  • Framework Integration — TanStack Start setup, Expo/React Native, client imports, type safety
  • Migration Guides — Migrate from NextAuth/Auth.js, Clerk, or Supabase Auth with schema mappings and session strategies
  • Troubleshooting — D1 consistency, CORS, OAuth redirect, admin 403, nanostore refresh, known bugs

Comments

Markdown supported