Authentication Composables
useDirectusAuth()
Main authentication composable with methods and state for user authentication.
Returns: DirectusAuth
interface DirectusAuth {
user: Ref<DirectusUser | null>
loggedIn: ComputedRef<boolean>
readMe: () => Promise<DirectusUser | null>
updateMe: (data: UpdateMeInput) => Promise<DirectusUser>
login: (email: string, password: string, options?: LoginOptions & { redirect?: boolean | RouteLocationRaw }) => Promise<DirectusUser | null>
loginWithProvider: (provider: string, redirectOnLogin?: boolean | string) => Promise<void>
logout: (redirect?: boolean | RouteLocationRaw) => Promise<void>
createUser: (data: RegisterUserInput) => Promise<DirectusUser>
register: (data: DirectusRegisterInput) => Promise<void>
inviteUser: (email: string, role: string, inviteUrl?: string) => Promise<void>
acceptUserInvite: (token: string, password: string) => Promise<void>
passwordRequest: (email: string, resetUrl?: string) => Promise<void>
passwordReset: (token: string, password: string) => Promise<void>
}Example:
const {
user,
loggedIn,
login,
logout,
readMe,
updateMe,
} = useDirectusAuth()
// Login
await login('user@example.com', 'password')
// Check if logged in
if (loggedIn.value) {
console.log('Logged in as:', user.value.email)
}
// Update user
await updateMe({ first_name: 'John' })
// Logout
await logout()Properties
user
- Type:
Ref<DirectusUser | null> - Description: Current authenticated user
const { user } = useDirectusAuth()
console.log(user.value?.email)
console.log(user.value?.first_name)
console.log(user.value?.role)loggedIn
- Type:
ComputedRef<boolean> - Description: Whether a user is currently logged in
const { loggedIn } = useDirectusAuth()
if (loggedIn.value) {
console.log('User is authenticated')
}Methods
readMe()
Fetch the current user's data.
Returns: Promise<DirectusUser | null>
const { readMe } = useDirectusAuth()
const user = await readMe()updateMe(data)
Update the current user's profile.
Parameters:
data: UpdateMeInput- Fields to update.roleandpoliciesare excluded to prevent privilege escalation.avataraccepts a pre-uploaded file ID (string), not a file object — upload the file first, then pass its ID here.
Returns: Promise<DirectusUser>
const { updateMe } = useDirectusAuth()
await updateMe({
first_name: 'John',
last_name: 'Doe',
})
// To update avatar, first upload the file, then attach its ID
await updateMe({ avatar: 'file-uuid' })login(email, password, options?)
Login with email and password.
Parameters:
email: string- User emailpassword: string- User passwordoptions?: LoginOptions & { redirect?: boolean | RouteLocationRaw }- Login options
Returns: Promise<DirectusUser | null>
const { login } = useDirectusAuth()
// Login with redirect (default)
await login('user@example.com', 'password')
// Login without redirect
await login('user@example.com', 'password', { redirect: false })
// Login with custom redirect
await login('user@example.com', 'password', { redirect: '/dashboard' })
// Login with OTP
await login('user@example.com', 'password', { otp: '123456' })loginWithProvider(provider, redirectOnLogin?)
Login with SSO/OAuth provider. Note that a redirect is required for SSO authentication, so if you are passing false to redirectOnLogin your browser will still redirect, but you will be redirected to the current page.
Parameters:
provider: string- Provider name (google, github, microsoft, etc.)redirectOnLogin?: string | boolean- URL to redirect to after login
Returns: Promise<void>
const { loginWithProvider } = useDirectusAuth()
// Login with Google
await loginWithProvider('google')
// Login with custom redirect
await loginWithProvider('google', '/dashboard')
// Login with redirect as boolean
await loginWithProvider('google', false)logout(redirect?)
Logout the current user.
Parameters:
redirect?: boolean | RouteLocationRaw- Where to redirect after logout
Returns: Promise<void>
const { logout } = useDirectusAuth()
// Logout with default redirect
await logout()
// Logout without redirect
await logout(false)
// Logout with custom redirect
await logout('/login')register(data)
Public sign-up via POST /users/register. Works without being logged in, but public registration must be enabled in your Directus project settings. Directus returns no body, so log the user in (or send them to verify their email) afterwards.
Parameters:
data: DirectusRegisterInputemail: stringpassword: stringfirst_name?: stringlast_name?: stringverification_url?: string- Where the verification email links to, when email verification is on
Returns: Promise<void>
const { register } = useDirectusAuth()
await register({
email: 'new@example.com',
password: 'secure-password',
first_name: 'John',
last_name: 'Doe',
})createUser(data)
Create a user via POST /users. Requires create permission on directus_users, so use it for admin flows rather than public sign-up.
Parameters:
data: RegisterUserInput- User data
Returns: Promise<DirectusUser>
const { createUser } = useDirectusAuth()
const newUser = await createUser({
email: 'new@example.com',
password: 'secure-password',
})inviteUser(email, role, inviteUrl?)
Invite a new user.
Parameters:
email: string- User emailrole: string- Role ID or UUIDinviteUrl?: string- Custom invite URL
Returns: Promise<void>
const { inviteUser } = useDirectusAuth()
await inviteUser(
'newuser@example.com',
'role-uuid',
'https://yourapp.com/accept-invite'
)acceptUserInvite(token, password)
Accept a user invitation.
Parameters:
token: string- Invite tokenpassword: string- New password
Returns: Promise<void>
const { acceptUserInvite } = useDirectusAuth()
await acceptUserInvite('invite-token', 'new-password')passwordRequest(email, resetUrl?)
Request a password reset.
Parameters:
email: string- User emailresetUrl?: string- Custom reset URL
Returns: Promise<void>
const { passwordRequest } = useDirectusAuth()
await passwordRequest(
'user@example.com',
'https://yourapp.com/reset-password'
)passwordReset(token, password)
Reset password with token.
Parameters:
token: string- Reset tokenpassword: string- New password
Returns: Promise<void>
const { passwordReset } = useDirectusAuth()
await passwordReset('reset-token', 'new-password')useDirectusUser()
Direct access to the current user state.
Returns: Ref<DirectusUser | null>
const user = useDirectusUser()
console.log(user.value?.email)
console.log(user.value?.first_name)
// Watch for changes
watch(user, (newUser) => {
if (newUser) {
console.log('User logged in:', newUser.email)
}
else {
console.log('User logged out')
}
})