nuxt-auth-sanctum-mfa
v0.0.21
Published
Nuxt module for Laravel Sanctum authentication
Readme
Nuxt Auth Sanctum
This module provides a simple way to use Laravel Sanctum with Nuxt by leveraging cookies-based authentication. SSR-ready!
Features
useSanctumAuthcomposable for easy access to the current user and authentication methods- Automated
CSRFtoken header and cookie management - Both
CSRandSSRmodes support - Pre-configured middleware for pages that require authentication
- Cast current user information to any class you want
- Compatible with default Nuxt
ofetchclient - TypeScript support
Note: Before using this module, please make sure that you have already configured Laravel Sanctum on your backend. You can find more information about Laravel Sanctum here.
Quick Setup
- Add
nuxt-auth-sanctumdependency to your project
# Using pnpm
pnpm add -D nuxt-auth-sanctum
# Using yarn
yarn add --dev nuxt-auth-sanctum
# Using npm
npm install --save-dev nuxt-auth-sanctum- Add
nuxt-auth-sanctumto themodulessection ofnuxt.config.ts
export default defineNuxtConfig({
modules: ['nuxt-auth-sanctum'],
// nuxt-auth-sanctum options (also configurable via environment variables)
sanctum: {
baseUrl: 'http://localhost:80', // Laravel API
origin: 'http://localhost:3000', // Nuxt app, by default will be used 'useRequestURL().origin'
},
});That's it! You can now use Nuxt Auth Sanctum in your Nuxt app ✨
Usage
In this package you can find the following:
- composables
useSanctumAuth- provides access to the current user and authentication methodsuseSanctumUser- provides access to the current useruseSanctumClient- provides access to theofetchclient with pre-configuredCSRFtoken header and cookie management
- middleware
sanctum:auth- middleware for pages that require authenticated usersanctum:guest- middleware for pages that require guest user
Composables
useSanctumUser
This composable provides access to the current authenticated user. It supports generic types, so you can get the user as any class you want.
interface MyCustomUser {
id: number;
login: string;
custom_metadata: {
group: string;
role: string;
};
}
const user = useSanctumUser<MyCustomUser>();If there is no authenticated user, the composable will return null.
useSanctumAuth
Composable provides 2 computed properties and 3 methods:
user- current authenticated user (basically the same asuseSanctumUser)isAuthenticated- boolean flag indicating whether the user is authenticated or notlogin- method for logging in the userlogout- method for logging out the userrefreshIdentity- method for manually re-fetching current authenticated user data
To authenticate a user you should pass credentials payload as an argument to the login method. The payload should contain all fields that are required by your Laravel Sanctum backend.
const { login } = useSanctumAuth();
const userCredentials = {
email: '[email protected]',
password: '123123',
};
await login(userCredentials);If login operation was successful, the user property will be updated with the current user information returned by the Laravel API.
By default, methods will use the following Laravel endpoints:
/loginto authenticate the user/logoutto log out the user/api/userto get the current user information/sanctum/csrf-cookieto get theCSRFtoken cookie
To change the default endpoints, please check the Configuration section.
useSanctumClient
All previous composables work on top of the ofetch client which can be used in your application as well.
The client is pre-configured with CSRF token header and cookie management.
All requests will be sent to the baseUrl specified in the Configuration section.
const client = useSanctumClient();
const { data, pending, error, refresh } = await useAsyncData('users', () =>
client('/api/users')
);Since client implements $Fetch interface, you can use it as a regular ofetch client.
Check examples in the ofetch documentation.
Middleware
sanctum:auth
This middleware checks if the user is authenticated. If not, it will redirect a user to the page specified in the redirect.onAuthOnly option (default is /login).
Also, you might want to remember what page the user was trying to access and redirect him back to that page after successful authentication. To do that, just enable the redirect.keepRequestedRoute option and it will be automatically stored in the URL for later redirect.
If there is no redirect rule the middleware will throw 403 error.
sanctum:guest
This middleware checks if the user is not authenticated. If not, it will redirect a user to the page specified in the redirect.onGuestOnly option (default is /).
If there is no redirect rule the middleware will throw 403 error.
Configuration
Here is the full example of the default module configuration:
baseUrl: 'http://localhost:80', // Laravel API
origin: 'http://localhost:3000', // Nuxt app (required for CSRF cookie), by default uses `useRequestURL().origin`
userStateKey: 'sanctum.user.identity', // user state key for Vue `useState` composable
redirectIfAuthenticated: false, // Redirect to onLogin if already authenticated
endpoints: {
csrf: '/sanctum/csrf-cookie', // CSRF cookie endpoint
login: '/login', // Endpoint that accepts user credentials
logout: '/logout', // Endpoint to destroy the current session
user: '/api/user', // Endpoint that return current user information
},
csrf: {
cookie: 'XSRF-TOKEN', // CSRF cookie name
header: 'X-XSRF-TOKEN', // CSRF header name
},
client: {
retry: false, // ofetch retry option (number | false)
},
redirect: {
keepRequestedRoute: false, // Keep requested route in the URL for later redirect
onLogin: '/', // Redirect to this page after successful login
onLogout: '/', // Redirect to this page after successful logout
onAuthOnly: '/login', // Redirect to this page if user is not authenticated
onGuestOnly: '/', // Redirect to this page if user is authenticated
},You can override any of these options in the nuxt.config.ts file:
export default defineNuxtConfig({
modules: ['nuxt-auth-sanctum'],
sanctum: {
baseUrl: 'http://localhost:80', // Your Laravel API
origin: 'http://localhost:3000', // Your Nuxt app
redirect: {
onLogin: '/dashboard', // Custom route after successful login
},
},
});Also, it is possible to override options via environment variables. It might be useful when you want to use .env file to provide baseUrl for Laravel API.
export default defineNuxtConfig({
modules: ['nuxt-auth-sanctum'],
runtimeConfig: {
public: {
sanctum: {
baseUrl: 'http://localhost:80',
},
},
},
});Development
# Install dependencies
yarn install
# Generate type stubs
yarn dev:prepare
# Develop with the playground
yarn dev
# Build the playground
yarn dev:build
# Run Prettier
yarn fmt
# Run ESLint
yarn lint
# Run Vitest
yarn test
yarn test:watch
# Release new version
yarn release