// src/services/auth.ts
import { DI, Registration } from '@aurelia/kernel';
import { createAuth0Client, Auth0Client, User } from '@auth0/auth0-spa-js';
import { environment } from '../environment';
export const IAuthService = DI.createInterface<IAuthService>('IAuthService');
export interface IAuthService {
isAuthenticated(): Promise<boolean>;
getUser(): Promise<User | undefined>;
login(): Promise<void>;
logout(): void;
handleRedirectCallback(): Promise<void>;
getAccessToken(): Promise<string>;
}
export class AuthService implements IAuthService {
private auth0Client?: Auth0Client;
async initialize(): Promise<void> {
if (this.auth0Client) return;
this.auth0Client = await createAuth0Client({
domain: environment.auth0.domain,
clientId: environment.auth0.clientId,
authorizationParams: {
redirect_uri: environment.auth0.redirectUri,
scope: environment.auth0.scope
},
useRefreshTokens: true,
cacheLocation: 'localstorage'
});
}
async login(): Promise<void> {
await this.ensureInitialized();
await this.auth0Client!.loginWithRedirect();
}
async handleRedirectCallback(): Promise<void> {
await this.ensureInitialized();
const query = window.location.search;
if (query.includes('code=') && query.includes('state=')) {
await this.auth0Client!.handleRedirectCallback();
window.history.replaceState({}, document.title, window.location.pathname);
}
}
async isAuthenticated(): Promise<boolean> {
await this.ensureInitialized();
return this.auth0Client!.isAuthenticated();
}
async getUser(): Promise<User | undefined> {
await this.ensureInitialized();
return this.auth0Client!.getUser();
}
async getAccessToken(): Promise<string> {
await this.ensureInitialized();
return this.auth0Client!.getTokenSilently();
}
logout(): void {
this.auth0Client?.logout({
logoutParams: {
returnTo: window.location.origin
}
});
}
private async ensureInitialized(): Promise<void> {
if (!this.auth0Client) {
await this.initialize();
}
}
}
export const AuthServiceRegistration = Registration.singleton(IAuthService, AuthService);