All skills
onmax avatar

/nuxt-better-auth

@de09c7b official
by Maxonmax/nuxt-skills715 stars
38

Guides authentication in Nuxt apps using @nuxtjs/better-auth. Use when installing or configuring the module, using its client or server APIs, protecting routes, refreshing sessions, or integrating Better Auth plugins.

Use this Skill: https://skilld.dev/gh/onmax/nuxt-skills/nuxt-better-auth

This session only. Nothing lands on disk.

referencesclient-auth.md

≈1k tokens on demand. Your agent reads this file only when SKILL.md points to it.

Client-side authentication

Choose an API

Need API
Session state and lifecycle actions useUserSession()
Direct Better Auth client or plugin methods useAuthClient()
Sign-in or sign-up form state useSignIn() or useSignUp()
Action state for a client or plugin method useAuthClientAction()
Action state for any async function useAction()
Refresh session state after a custom auth endpoint runWithSessionRefresh()
Request-scoped auth fetch with typed endpoints useAuthRequestFetch()
SSR-safe auth-bound data useAuthAsyncData()

useUserSessionState() is a deprecated alias for useUserSession().

Session state and direct client access

const { user, session, loggedIn, ready, fetchSession, signOut, updateUser } = useUserSession()
const client = useAuthClient()

useUserSession() is safe to return from a Pinia setup store. useAuthClient() returns the client in the browser and null during SSR.

Sign-in and sign-up forms

Use action composables for form flows that need loading, error, and success state.

const signInEmail = useSignIn('email')

await signInEmail.execute({
  email: 'user@example.com',
  password: 'password123',
})
const signUpEmail = useSignUp('email')
await signUpEmail.execute({ email, password, name })

If no onSuccess callback is passed, sign-in and sign-up can redirect to a safe local ?redirect=... target or the configured authenticated redirect.

Plugin client actions

Use useAuthClientAction() for Better Auth client/plugin methods that should expose action state.

const openPortal = useAuthClientAction(client => client.customer.portal)
await openPortal.execute()

Use useAction() for the same action state around an arbitrary async function.

Custom auth endpoints

Use runWithSessionRefresh() around custom endpoints that create or change the current session.

await runWithSessionRefresh(() =>
  $fetch('/api/custom-login', {
    method: 'POST',
    body: { email, password },
  }),
)

The helper awaits your request, then refreshes local session state unless the result is a Better Auth action error result.

Auth-bound data

Use useAuthRequestFetch() for low-level request control. During SSR it forwards the request context, including cookies.

The endpoint below comes from a configured custom customer plugin. Replace it with an endpoint generated by the consumer's Better Auth config.

const requestFetch = useAuthRequestFetch()
const customerState = await requestFetch('/api/auth/customer/state')

Use useAuthAsyncData() for keyed SSR data with Nuxt loading and error state. It requires an authenticated user by default and resolves to null without calling the endpoint when the user is signed out.

const { data, pending, error } = await useAuthAsyncData(
  'customer-state',
  requestFetch => requestFetch('/api/auth/customer/state'),
)

Force refresh

await fetchSession({ force: true })

Use force: true when the server-side session payload changed and Better Auth's cookie cache should be bypassed for this fetch.

Redirect rule

If you read route.query.redirect, validate it before navigating. Only allow local paths.

BetterAuthState

<BetterAuthState> renders once session hydration completes (ready === true) and supports a loading placeholder.

<BetterAuthState>
  <template #default="{ loggedIn, user, signOut }">
    <p v-if="loggedIn">Hi {{ user?.name }}</p>
    <button v-else @click="navigateTo('/login')">Sign in</button>
  </template>
  <template #placeholder>
    <p>Loading...</p>
  </template>
</BetterAuthState>

Source: SKILL.md on GitHub

No alerts8d4 checks · Risk SAFE
  • Gen Agent Trust Hub8d

    This skill provides comprehensive documentation and guidance for integrating the @nuxtjs/better-auth module into Nuxt.js applications. It covers installation, client and server-side API usage, database integration with NuxtHub, and route protection strategies. The skill follows security best practices, such as recommending environment variables for secret management and local path validation for redirects. No malicious patterns or security risks were identified.

  • Socket8d

    No alerts

  • Snyk8d

    Risk: LOW · No issues

  • Runlayer7mo

    1/9 files flagged

Signed by skilld at de09c7b. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 3 days ago.

Activeupdated last week
  • Nuxt
  • TypeScript
  • better-auth
  • authentication
  • composables
  • route-protection
  • server-auth
  • nuxthub

README badge

README badge for onmax/nuxt-skills/nuxt-better-auth

Nuxt authentication module built on Better Auth, providing useUserSession composable, server route protection, and plugin integration for login/signup flows. Currently alpha status. Targets Nuxt 4+ apps implementing session-based auth with support for Better Auth plugins like passkey and 2FA.

Generated from the current SKILL.md.

Is this production-ready?
No. The module is in alpha (v0.0.2-alpha.19) and APIs may change. Not recommended for production use.
What versions of Nuxt does this support?
Nuxt 4 and later.
Can I use this with an external auth backend?
Yes, via clientOnly mode. This allows you to connect to auth providers outside Nuxt with CORS handling.
Does this support multi-factor authentication and passkeys?
Yes, through Better Auth plugins for 2FA, passkey, and admin functionality.
How do I protect API routes and pages?
Use `requireUserSession()` on the server side for API routes, and `routeRules` or `definePageMeta` with the `auth` property for page protection.

Generated from the current SKILL.md. These answers refresh after source changes.