Nuxt Auth Utils
Minimalist Authentication module for Nuxt exposing Vue composables and server utils.
Features
Requirements
This module only works with SSR (server-side rendering) enabled as it uses server API routes. You cannot use this module with nuxt generate
.
Quick Setup
- Add
nuxt-auth-utils
dependency to your project
pnpm add -D nuxt-auth-utils
yarn add --dev nuxt-auth-utils
npm install --save-dev nuxt-auth-utils
- Add
nuxt-auth-utils
to the modules
section of nuxt.config.ts
export default defineNuxtConfig({
modules: [
'nuxt-auth-utils'
]
})
- Add a
NUXT_SESSION_PASSWORD
env variable with at least 32 characters in the .env
.
NUXT_SESSION_PASSWORD=password-with-at-least-32-characters
Nuxt Auth Utils can generate one for you when running Nuxt in development the first time when no NUXT_SESSION_PASSWORD
is set.
- That's it! You can now add authentication to your Nuxt app ✨
Vue Composables
Nuxt Auth Utils automatically adds some plugins to fetch the current user session to let you access it from your Vue components.
User Session
<script setup>
const { loggedIn, user, session, clear } = useUserSession()
</script>
<template>
<div v-if="loggedIn">
<h1>Welcome {{ user.login }}!</h1>
<p>Logged in since {{ session.loggedInAt }}</p>
<button @click="clear">Logout</button>
</div>
<div v-else>
<h1>Not logged in</h1>
<a href="/api/auth/github">Login with GitHub</a>
</div>
</template>
Server Utils
The following helpers are auto-imported in your server/
directory.
Session Management
await setUserSession(event, {
user: {
},
loggedInAt: new Date()
})
const session = await getUserSession(event)
await clearUserSession(event)
const session = await requireUserSession(event)
You can define the type for your user session by creating a type declaration file (for example, auth.d.ts
) in your project to augment the UserSession
type:
declare module '#auth-utils' {
interface UserSession {
}
}
export {}
OAuth Event Handlers
All helpers are exposed from the oauth
global variable and can be used in your server routes or API routes.
The pattern is oauth.<provider>EventHandler({ onSuccess, config?, onError? })
, example: oauth.githubEventHandler
.
The helper returns an event handler that automatically redirects to the provider authorization page and then call onSuccess
or onError
depending on the result.
The config
can be defined directly from the runtimeConfig
in your nuxt.config.ts
:
export default defineNuxtConfig({
runtimeConfig: {
oauth: {
<provider>: {
clientId: '...',
clientSecret: '...'
}
}
}
})
It can also be set using environment variables:
NUXT_OAUTH_<PROVIDER>_CLIENT_ID
NUXT_OAUTH_<PROVIDER>_CLIENT_SECRET
Supported OAuth Providers
- Auth0
- Discord
- GitHub
- Google
- Spotify
- Twitch
- Battle.net
- Keycloak
You can add your favorite provider by creating a new file in src/runtime/server/lib/oauth/.
Example
Example: ~/server/routes/auth/github.get.ts
export default oauth.githubEventHandler({
config: {
emailRequired: true
},
async onSuccess(event, { user, tokens }) {
await setUserSession(event, {
user: {
githubId: user.id
}
})
return sendRedirect(event, '/')
},
onError(event, error) {
console.error('GitHub OAuth error:', error)
return sendRedirect(event, '/')
},
})
Make sure to set the callback URL in your OAuth app settings as <your-domain>/auth/github
.
Development
npm install
npm run dev:prepare
npm run dev
npm run dev:build
npm run lint
npm run test
npm run test:watch
npm run release