An Angular 20+ wrapper for Better Auth. Provides reactive session handling with signals, clean DI provider setup with observables, and modern guards.
ngx-better-auth | Angular | Better Auth |
---|---|---|
latest |
>=20 |
>=1.3.7 |
npm install ngx-better-auth better-auth
First, configure your Better Auth client in your application:
// app.config.ts
import { ApplicationConfig } from '@angular/core'
import { provideBetterAuth } from 'ngx-better-auth'
import { environment } from './environments/environment'
import { adminClient, twoFactorClient, usernameClient } from 'better-auth/client/plugins'
export const appConfig: ApplicationConfig = {
providers: [
provideBetterAuth({
baseURL: environment.apiUrl, // it works also with proxy config
basePath: '/auth', // optional, default is '/api/auth'
// Example with plugins
plugins: [
usernameClient(),
twoFactorClient({
onTwoFactorRedirect() {
window.location.href = '/two-factor-auth'
},
}),
adminClient({
ac: accessControl,
roles: {
admin,
moderator,
user,
},
}),
],
})
]
}
You can inject different services depending on your needs.
AuthService provides the core Better Auth client methods (signIn, signOut, signUp, e.g.).
The full list of methods is available at the end of this README.
- ✅ Two Factor ➡️
TwoFactorService
- ✅ Username ➡️
UsernameService
- ❌ Anonymous
- ❌ Phone Number
- ✅ Magic Link ➡️
MagicLinkService
- ✅ Email OTP ➡️
EmailOtpService
- ✅ Passkey ➡️
PasskeyService
- ✅ Generic OAuth ➡️
GenericOauthService
- ✅ One Tap ➡️
OneTapService
- ❌ Sign In With Ethereum
- ✅ Admin ➡️
AdminService
- ❌ API Key
- ❌ MCP
- ✅ Organization ➡️
OrganizationService
- ❌ OIDC Provider
- ❌ SSO
- ❌ Bearer
- ❌ Device Authorization
- ❌ Captcha
- ❌ Last Login Method
- ❌ Multi Session
- ❌ One Time Token
- ❌ JWT
session
→ a signal with the current session or nullisLoggedIn
→ a computed boolean
import { AuthService } from "ngx-better-auth"
import { inject } from "@angular/core"
@Component({
// ...
})
export class MyComponent {
private readonly authService = inject(AuthService)
get isLoggedIn() {
return this.authService.isLoggedIn()
}
get userName() {
return this.authService.session()?.user.name
}
}
This library ships with guards to quickly set up route protection.
redirectUnauthorizedTo(['/login'])
→ redirect if not logged inredirectLoggedInTo(['/'])
→ redirect if already logged inhasRole(['admin'], ['/unauthorized'])
→ restrict access by role and redirect if not authorized
import { Routes } from '@angular/router'
import { canActivate, redirectLoggedInTo, redirectUnauthorizedTo, hasRole } from 'ngx-better-auth'
export const routes: Routes = [
{
path: '',
component: SomeComponent,
...canActivate(redirectUnauthorizedTo(['/login']))
},
{
path: 'admin',
component: AdminComponent,
...canActivate(hasRole(['admin'], ['/unauthorized']))
},
{
path: 'login',
component: LoginComponent,
...canActivate(redirectLoggedInTo(['/']))
}
]