@acontplus/ng-auth 2.1.1 → 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1083,9 +1083,12 @@ class Login {
|
|
|
1083
1083
|
const socialIconNames = ['google', 'microsoft', 'github', 'facebook', 'apple', 'linkedin'];
|
|
1084
1084
|
socialIconNames.forEach((name) => {
|
|
1085
1085
|
const icon = DEFAULT_ICONS.find((i) => i.name === name);
|
|
1086
|
-
if (icon) {
|
|
1086
|
+
if (icon?.data) {
|
|
1087
1087
|
this.iconRegistry.addSvgIconLiteral(name, this.sanitizer.bypassSecurityTrustHtml(icon.data));
|
|
1088
1088
|
}
|
|
1089
|
+
else {
|
|
1090
|
+
console.warn(`Icon '${name}' not found in DEFAULT_ICONS`);
|
|
1091
|
+
}
|
|
1089
1092
|
});
|
|
1090
1093
|
}
|
|
1091
1094
|
ngOnInit() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acontplus-ng-auth.mjs","sources":["../../../../packages/ng-auth/src/lib/domain/repositories/auth-repository.ts","../../../../packages/ng-auth/src/lib/data/repositories/auth-http-repository.ts","../../../../packages/ng-auth/src/lib/data/repositories/index.ts","../../../../packages/ng-auth/src/lib/data/index.ts","../../../../packages/ng-auth/src/lib/domain/models/auth.ts","../../../../packages/ng-auth/src/lib/domain/models/index.ts","../../../../packages/ng-auth/src/lib/domain/repositories/index.ts","../../../../packages/ng-auth/src/lib/repositories/auth-token-repository-impl.ts","../../../../packages/ng-auth/src/lib/services/auth-url-redirect.ts","../../../../packages/ng-auth/src/lib/guards/auth-guard.ts","../../../../packages/ng-auth/src/lib/interceptors/auth-redirect-interceptor.ts","../../../../packages/ng-auth/src/lib/services/csrf-api.ts","../../../../packages/ng-auth/src/lib/interceptors/csrf-interceptor.ts","../../../../packages/ng-auth/src/lib/providers/auth-providers.ts","../../../../packages/ng-auth/src/lib/providers/index.ts","../../../../packages/ng-auth/src/lib/services/auth-state.ts","../../../../packages/ng-auth/src/lib/ui/login/login.ts","../../../../packages/ng-auth/src/lib/ui/login/login.html","../../../../packages/ng-auth/src/lib/ui/login/index.ts","../../../../packages/ng-auth/src/lib/ui/oauth-callback/oauth-callback.ts","../../../../packages/ng-auth/src/lib/ui/oauth-callback/index.ts","../../../../packages/ng-auth/src/lib/ui/index.ts","../../../../packages/ng-auth/src/acontplus-ng-auth.ts"],"sourcesContent":["// src/lib/domain/repositories/auth-repository.ts\nimport { Observable } from 'rxjs';\nimport {\n LoginRequest,\n RegisterRequest,\n RefreshTokenRequest,\n ForgotPasswordRequest,\n ResetPasswordRequest,\n ChangePasswordRequest,\n VerifyEmailRequest,\n ResendVerificationRequest,\n MfaSetupResponse,\n VerifyMfaRequest,\n SocialLoginRequest,\n SocialProvider,\n SocialAuthUrl,\n DomainDiscoveryRequest,\n DomainDiscoveryResponse,\n OAuthConfig,\n TenantConfig,\n} from '../models/auth';\nimport { AuthTokens } from '@acontplus/core';\n\nexport abstract class AuthRepository {\n // Core Authentication\n abstract login(request: LoginRequest): Observable<AuthTokens>;\n abstract register(request: RegisterRequest): Observable<AuthTokens>;\n abstract refreshToken(request: RefreshTokenRequest): Observable<AuthTokens>;\n abstract logout(email: string, refreshToken: string): Observable<void>;\n\n // Password Management\n abstract forgotPassword(request: ForgotPasswordRequest): Observable<void>;\n abstract resetPassword(request: ResetPasswordRequest): Observable<void>;\n abstract changePassword(request: ChangePasswordRequest): Observable<void>;\n\n // Email Verification\n abstract verifyEmail(request: VerifyEmailRequest): Observable<void>;\n abstract resendVerificationEmail(request: ResendVerificationRequest): Observable<void>;\n\n // MFA/2FA\n abstract setupMfa(): Observable<MfaSetupResponse>;\n abstract verifyMfa(request: VerifyMfaRequest): Observable<AuthTokens>;\n abstract disableMfa(code: string): Observable<void>;\n\n // Social Login\n abstract getSocialAuthUrl(\n provider: SocialProvider,\n config?: Partial<OAuthConfig>,\n ): Observable<SocialAuthUrl>;\n abstract socialLogin(request: SocialLoginRequest): Observable<AuthTokens>;\n\n // Multi-Tenant / Domain Discovery\n abstract discoverDomain(request: DomainDiscoveryRequest): Observable<DomainDiscoveryResponse>;\n abstract getTenantConfig(tenantId: string): Observable<TenantConfig>;\n abstract listTenants(): Observable<TenantConfig[]>;\n}\n","// src/lib/data/repositories/auth-http-repository.ts\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { AuthRepository } from '../../domain/repositories/auth-repository';\nimport {\n LoginRequest,\n RegisterRequest,\n RefreshTokenRequest,\n ForgotPasswordRequest,\n ResetPasswordRequest,\n ChangePasswordRequest,\n VerifyEmailRequest,\n ResendVerificationRequest,\n MfaSetupResponse,\n VerifyMfaRequest,\n SocialLoginRequest,\n SocialProvider,\n SocialAuthUrl,\n DomainDiscoveryRequest,\n DomainDiscoveryResponse,\n OAuthConfig,\n TenantConfig,\n} from '../../domain/models/auth';\nimport { AuthTokens } from '@acontplus/core';\nimport { AUTH_API } from '@acontplus/ng-config';\n\nfunction getDeviceInfo(): string {\n return `${navigator.platform ?? 'Unknown'} - ${navigator.userAgent}`;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthHttpRepository extends AuthRepository {\n private readonly http = inject(HttpClient);\n private readonly URL = `${AUTH_API.AUTH}`;\n\n // Core Authentication\n login(request: LoginRequest): Observable<AuthTokens> {\n return this.http.post<AuthTokens>(`${this.URL}login`, request, {\n headers: { 'Device-Info': getDeviceInfo() },\n withCredentials: true,\n });\n }\n\n register(request: RegisterRequest): Observable<AuthTokens> {\n return this.http.post<AuthTokens>(`${this.URL}register`, request, {\n headers: { 'Device-Info': getDeviceInfo() },\n withCredentials: true,\n });\n }\n\n refreshToken(request: RefreshTokenRequest): Observable<AuthTokens> {\n return this.http.post<AuthTokens>(`${this.URL}refresh`, request, {\n headers: { 'Device-Info': getDeviceInfo() },\n withCredentials: true,\n });\n }\n\n logout(email: string, refreshToken: string): Observable<void> {\n return this.http.post<void>(\n `${this.URL}logout`,\n { email, refreshToken: refreshToken || undefined },\n { withCredentials: true },\n );\n }\n\n // Password Management\n forgotPassword(request: ForgotPasswordRequest): Observable<void> {\n return this.http.post<void>(`${this.URL}forgot-password`, request);\n }\n\n resetPassword(request: ResetPasswordRequest): Observable<void> {\n return this.http.post<void>(`${this.URL}reset-password`, request);\n }\n\n changePassword(request: ChangePasswordRequest): Observable<void> {\n return this.http.post<void>(`${this.URL}change-password`, request, {\n withCredentials: true,\n });\n }\n\n // Email Verification\n verifyEmail(request: VerifyEmailRequest): Observable<void> {\n return this.http.post<void>(`${this.URL}verify-email`, request);\n }\n\n resendVerificationEmail(request: ResendVerificationRequest): Observable<void> {\n return this.http.post<void>(`${this.URL}resend-verification`, request);\n }\n\n // MFA/2FA\n setupMfa(): Observable<MfaSetupResponse> {\n return this.http.post<MfaSetupResponse>(`${this.URL}mfa/setup`, null, {\n withCredentials: true,\n });\n }\n\n verifyMfa(request: VerifyMfaRequest): Observable<AuthTokens> {\n return this.http.post<AuthTokens>(`${this.URL}mfa/verify`, request, {\n headers: { 'Device-Info': getDeviceInfo() },\n withCredentials: true,\n });\n }\n\n disableMfa(code: string): Observable<void> {\n return this.http.post<void>(`${this.URL}mfa/disable`, { code }, { withCredentials: true });\n }\n\n // Social Login\n getSocialAuthUrl(\n provider: SocialProvider,\n config?: Partial<OAuthConfig>,\n ): Observable<SocialAuthUrl> {\n const params: Record<string, string> = {};\n if (config?.tenantId) params['tenantId'] = config.tenantId;\n if (config?.domain) params['domain'] = config.domain;\n if (config?.redirectUri) params['redirectUri'] = config.redirectUri;\n\n const queryString =\n Object.keys(params).length > 0 ? '?' + new URLSearchParams(params).toString() : '';\n\n return this.http.get<SocialAuthUrl>(`${this.URL}social/${provider}/url${queryString}`);\n }\n\n socialLogin(request: SocialLoginRequest): Observable<AuthTokens> {\n return this.http.post<AuthTokens>(`${this.URL}social/${request.provider}/callback`, request, {\n headers: { 'Device-Info': getDeviceInfo() },\n withCredentials: true,\n });\n }\n\n // Multi-Tenant / Domain Discovery\n discoverDomain(request: DomainDiscoveryRequest): Observable<DomainDiscoveryResponse> {\n return this.http.post<DomainDiscoveryResponse>(`${this.URL}domain-discovery`, request);\n }\n\n getTenantConfig(tenantId: string): Observable<TenantConfig> {\n return this.http.get<TenantConfig>(`${this.URL}tenants/${tenantId}`);\n }\n\n listTenants(): Observable<TenantConfig[]> {\n return this.http.get<TenantConfig[]>(`${this.URL}tenants`);\n }\n}\n","// src/lib/data/repositories/index.ts\nexport * from './auth-http-repository';\n","// src/lib/data/index.ts\nexport * from './repositories';\n","// src/lib/domain/models/auth.ts\n\nexport interface LoginRequest {\n email: string;\n password: string;\n rememberMe?: boolean;\n}\n\nexport interface RegisterRequest {\n email: string;\n displayName: string;\n password: string;\n}\n\nexport interface RefreshTokenRequest {\n email: string;\n refreshToken: string;\n}\n\n// Password Reset\nexport interface ForgotPasswordRequest {\n email: string;\n}\n\nexport interface ResetPasswordRequest {\n token: string;\n newPassword: string;\n}\n\nexport interface ChangePasswordRequest {\n currentPassword: string;\n newPassword: string;\n}\n\n// Email Verification\nexport interface VerifyEmailRequest {\n token: string;\n}\n\nexport interface ResendVerificationRequest {\n email: string;\n}\n\n// MFA/2FA\nexport interface MfaSetupResponse {\n secret: string;\n qrCodeUrl: string;\n backupCodes: string[];\n}\n\nexport interface VerifyMfaRequest {\n code: string;\n email: string;\n}\n\nexport interface LoginWithMfaRequest extends LoginRequest {\n mfaCode?: string;\n}\n\n// Social Login\nexport type SocialProvider = 'google' | 'microsoft' | 'github' | 'facebook' | 'apple' | 'linkedin';\n\nexport interface SocialLoginRequest {\n provider: SocialProvider;\n\n // OAuth 2.0 Authorization Code Flow\n code?: string; // Authorization code from OAuth callback\n state?: string; // CSRF state verification\n\n // Legacy Token-based Flow (for direct token exchange)\n accessToken?: string;\n idToken?: string;\n\n // Multi-tenant context\n domain?: string; // For multi-tenant scenarios\n tenantId?: string; // For Azure AD, Google Workspace\n}\n\nexport interface SocialAuthUrl {\n url: string;\n state: string;\n}\n\n// Multi-Tenant OAuth / Domain-based Auth\nexport interface TenantConfig {\n tenantId: string;\n domain: string;\n displayName: string;\n provider: SocialProvider;\n clientId?: string;\n issuer?: string; // OIDC issuer URL\n allowedDomains?: string[]; // Email domains allowed for this tenant\n customParameters?: Record<string, string>;\n}\n\nexport interface DomainDiscoveryRequest {\n email: string;\n}\n\nexport interface DomainDiscoveryResponse {\n provider?: SocialProvider;\n tenantId?: string;\n domain?: string;\n discoveryUrl?: string;\n requiresOAuth: boolean;\n allowPasswordLogin: boolean;\n}\n\nexport interface OAuthConfig {\n provider: SocialProvider;\n clientId: string;\n redirectUri: string;\n scope: string;\n responseType: 'code' | 'token' | 'id_token' | 'code id_token';\n responseMode?: 'query' | 'fragment' | 'form_post';\n tenantId?: string; // Azure AD, Google Workspace tenant\n domain?: string; // Domain hint\n prompt?: 'none' | 'login' | 'consent' | 'select_account';\n loginHint?: string; // Email hint\n state?: string;\n nonce?: string;\n additionalParams?: Record<string, string>;\n}\n\nexport interface OAuthCallbackParams {\n code?: string;\n state?: string;\n error?: string;\n error_description?: string;\n id_token?: string;\n access_token?: string;\n}\n\n// Auth Status\nexport interface AuthStatus {\n isAuthenticated: boolean;\n mfaRequired: boolean;\n emailVerified: boolean;\n}\n","// src/lib/domain/repositories/index.ts\nexport * from './auth';\n","// src/lib/domain/repositories/index.ts\nexport * from './auth-repository';\n","import { Injectable, inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { jwtDecode } from 'jwt-decode';\nimport { AuthTokens, UserData } from '@acontplus/core';\nimport { AuthTokenRepository, ENVIRONMENT } from '@acontplus/ng-config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthTokenRepositoryImpl implements AuthTokenRepository {\n private environment = inject(ENVIRONMENT);\n private platformId = inject(PLATFORM_ID);\n\n saveTokens(tokens: AuthTokens, rememberMe = false): void {\n if (isPlatformBrowser(this.platformId)) {\n this.setToken(tokens.token, rememberMe);\n this.setRefreshToken(tokens.refreshToken, rememberMe);\n }\n }\n\n getToken(): string | null {\n if (!isPlatformBrowser(this.platformId)) {\n return null;\n }\n return (\n localStorage.getItem(this.environment.tokenKey) ||\n sessionStorage.getItem(this.environment.tokenKey)\n );\n }\n\n getRefreshToken(): string | null {\n if (!isPlatformBrowser(this.platformId)) {\n return null;\n }\n return (\n localStorage.getItem(this.environment.refreshTokenKey) ||\n sessionStorage.getItem(this.environment.refreshTokenKey)\n );\n }\n\n setToken(token: string, rememberMe = false): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n if (rememberMe) {\n localStorage.setItem(this.environment.tokenKey, token);\n // Clear from sessionStorage to avoid conflicts\n sessionStorage.removeItem(this.environment.tokenKey);\n } else {\n sessionStorage.setItem(this.environment.tokenKey, token);\n // Clear from localStorage to avoid conflicts\n localStorage.removeItem(this.environment.tokenKey);\n }\n }\n\n setRefreshToken(refreshToken: string, rememberMe = false): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n if (rememberMe) {\n localStorage.setItem(this.environment.refreshTokenKey, refreshToken);\n // Clear from sessionStorage to avoid conflicts\n sessionStorage.removeItem(this.environment.refreshTokenKey);\n } else {\n sessionStorage.setItem(this.environment.refreshTokenKey, refreshToken);\n // Clear from localStorage to avoid conflicts\n localStorage.removeItem(this.environment.refreshTokenKey);\n }\n }\n\n clearTokens(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n localStorage.removeItem(this.environment.tokenKey);\n localStorage.removeItem(this.environment.refreshTokenKey);\n sessionStorage.removeItem(this.environment.tokenKey);\n sessionStorage.removeItem(this.environment.refreshTokenKey);\n }\n\n isAuthenticated(): boolean {\n const accessToken = this.getToken();\n\n if (!accessToken) {\n return false;\n }\n\n try {\n const decodedAccessToken = jwtDecode(accessToken);\n const accessExpiration = Number(decodedAccessToken.exp);\n const currentTimeUTC = Math.floor(Date.now() / 1000);\n\n return accessExpiration > currentTimeUTC;\n } catch {\n return false;\n }\n }\n\n needsRefresh(): boolean {\n const accessToken = this.getToken();\n if (!accessToken) {\n return false;\n }\n\n try {\n const decodedToken = jwtDecode(accessToken);\n const expiration = Number(decodedToken.exp);\n const currentTimeUTC = Math.floor(Date.now() / 1000);\n const timeUntilExpiry = expiration - currentTimeUTC;\n\n return timeUntilExpiry <= 300; // 5 minutes\n } catch {\n return false;\n }\n }\n\n getTokenPayload(): unknown {\n const token = this.getToken();\n if (!token) return null;\n\n try {\n return jwtDecode(token);\n } catch {\n return null;\n }\n }\n\n /**\n * Determines if tokens are stored persistently (localStorage) vs session (sessionStorage)\n */\n isRememberMeEnabled(): boolean {\n if (!isPlatformBrowser(this.platformId)) {\n return false;\n }\n\n // Check if tokens exist in localStorage (persistent storage)\n const tokenInLocalStorage = localStorage.getItem(this.environment.tokenKey);\n const refreshTokenInLocalStorage = localStorage.getItem(this.environment.refreshTokenKey);\n\n return !!(tokenInLocalStorage || refreshTokenInLocalStorage);\n }\n\n getUserData(): UserData | null {\n const token = this.getToken();\n if (!token) {\n return null;\n }\n\n try {\n const decodedToken = jwtDecode<Record<string, unknown>>(token);\n\n const email =\n decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'] ??\n decodedToken['email'] ??\n decodedToken['sub'] ??\n decodedToken['user_id'];\n\n const displayName =\n decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname'] ??\n decodedToken['displayName'] ??\n decodedToken['display_name'] ??\n decodedToken['name'] ??\n decodedToken['given_name'];\n\n const name = decodedToken['name'] ?? displayName;\n\n if (!email) {\n return null;\n }\n\n const userData: UserData = {\n email: email.toString(),\n displayName: displayName?.toString() ?? 'Unknown User',\n name: name?.toString(),\n roles: this.extractArrayField(decodedToken, ['roles', 'role']),\n permissions: this.extractArrayField(decodedToken, ['permissions', 'perms']),\n tenantId:\n decodedToken['tenantId']?.toString() ??\n decodedToken['tenant_id']?.toString() ??\n decodedToken['tenant']?.toString(),\n companyId:\n decodedToken['companyId']?.toString() ??\n decodedToken['company_id']?.toString() ??\n decodedToken['organizationId']?.toString() ??\n decodedToken['org_id']?.toString(),\n locale: decodedToken['locale']?.toString(),\n timezone: decodedToken['timezone']?.toString() ?? decodedToken['tz']?.toString(),\n };\n\n return userData;\n } catch {\n return null;\n }\n }\n\n /**\n * Extract array field from decoded token, trying multiple possible field names\n */\n private extractArrayField(\n decodedToken: Record<string, unknown>,\n fieldNames: string[],\n ): string[] | undefined {\n for (const fieldName of fieldNames) {\n const value = decodedToken[fieldName];\n if (Array.isArray(value)) {\n return value.map((v) => v.toString());\n }\n if (typeof value === 'string') {\n // Handle comma-separated string values\n return value\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n }\n }\n return undefined;\n }\n}\n","import { Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\n\n/**\n * Service to manage URL redirection after authentication\n * Stores the intended URL when session is lost and redirects to it after successful login\n * SSR-compatible by checking platform before accessing sessionStorage\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthUrlRedirect {\n private readonly REDIRECT_URL_KEY = 'acp_redirect_url';\n private readonly EXCLUDED_ROUTES = [\n '/login',\n '/auth',\n '/register',\n '/forgot-password',\n '/reset-password',\n ];\n\n private readonly router = inject(Router);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly document = inject(DOCUMENT);\n\n /**\n * Stores the current URL for later redirection\n * @param url - The URL to store (defaults to current URL)\n */\n storeIntendedUrl(url?: string): void {\n // Only store in browser environment\n if (!this.isBrowser()) {\n return;\n }\n\n const urlToStore = url || this.router.url;\n\n // Don't store authentication-related routes\n if (this.isExcludedRoute(urlToStore)) {\n return;\n }\n\n // Don't store URLs with query parameters that might contain sensitive data\n const urlWithoutParams = urlToStore.split('?')[0];\n this.getSessionStorage()?.setItem(this.REDIRECT_URL_KEY, urlWithoutParams);\n }\n\n /**\n * Gets the stored intended URL\n * @returns The stored URL or null if none exists\n */\n getIntendedUrl(): string | null {\n if (!this.isBrowser()) {\n return null;\n }\n return this.getSessionStorage()?.getItem(this.REDIRECT_URL_KEY) || null;\n }\n\n /**\n * Redirects to the stored URL and clears it from storage\n * @param defaultRoute - The default route to navigate to if no URL is stored\n */\n redirectToIntendedUrl(defaultRoute = '/'): void {\n const intendedUrl = this.getIntendedUrl();\n\n if (intendedUrl && !this.isExcludedRoute(intendedUrl)) {\n this.clearIntendedUrl();\n this.router.navigateByUrl(intendedUrl);\n } else {\n this.router.navigate([defaultRoute]);\n }\n }\n\n /**\n * Clears the stored intended URL\n */\n clearIntendedUrl(): void {\n if (!this.isBrowser()) {\n return;\n }\n this.getSessionStorage()?.removeItem(this.REDIRECT_URL_KEY);\n }\n\n /**\n * Checks if a URL should be excluded from redirection\n * @param url - The URL to check\n * @returns True if the URL should be excluded\n */\n private isExcludedRoute(url: string): boolean {\n return this.EXCLUDED_ROUTES.some((route) => url.includes(route));\n }\n\n /**\n * Stores the current URL if it's not an excluded route\n * Useful for guards and interceptors\n */\n storeCurrentUrlIfAllowed(): void {\n const currentUrl = this.router.url;\n if (!this.isExcludedRoute(currentUrl)) {\n this.storeIntendedUrl(currentUrl);\n }\n }\n\n /**\n * Checks if we're running in a browser environment\n * @returns True if running in browser, false if SSR\n */\n private isBrowser(): boolean {\n return isPlatformBrowser(this.platformId);\n }\n\n /**\n * Safely gets sessionStorage reference\n * @returns sessionStorage object or null if not available\n */\n private getSessionStorage(): Storage | null {\n if (!this.isBrowser()) {\n return null;\n }\n try {\n return this.document.defaultView?.sessionStorage || null;\n } catch {\n // Handle cases where sessionStorage might be disabled\n return null;\n }\n }\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { AuthTokenRepositoryImpl } from '../repositories/auth-token-repository-impl';\nimport { AuthUrlRedirect } from '../services/auth-url-redirect';\nimport { ENVIRONMENT } from '@acontplus/ng-config';\n\nexport const authGuard: CanActivateFn = (_route, state) => {\n const tokenRepository = inject(AuthTokenRepositoryImpl);\n const router = inject(Router);\n const urlRedirectService = inject(AuthUrlRedirect);\n const environment = inject(ENVIRONMENT);\n\n if (tokenRepository.isAuthenticated()) {\n return true;\n }\n\n // Store the current URL for redirection after login\n urlRedirectService.storeIntendedUrl(state.url);\n\n // Redirect to login page (configurable via environment)\n router.navigate([`/${environment.loginRoute}`]);\n return false;\n};\n","import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { catchError } from 'rxjs/operators';\nimport { throwError } from 'rxjs';\nimport { AuthUrlRedirect } from '../services/auth-url-redirect';\nimport { AuthTokenRepositoryImpl } from '../repositories/auth-token-repository-impl';\nimport { ENVIRONMENT } from '@acontplus/ng-config';\n\n/**\n * Interceptor that handles authentication errors and manages URL redirection\n * Captures the current URL when a 401 error occurs and redirects to login\n */\nexport const authRedirectInterceptor: HttpInterceptorFn = (req, next) => {\n const router = inject(Router);\n const urlRedirectService = inject(AuthUrlRedirect);\n const tokenRepository = inject(AuthTokenRepositoryImpl);\n const environment = inject(ENVIRONMENT);\n\n return next(req).pipe(\n catchError((error: HttpErrorResponse) => {\n // Handle 401 Unauthorized errors\n if (error.status === 401) {\n // Only store and redirect if user was previously authenticated\n // This prevents redirect loops and handles session expiry scenarios\n if (tokenRepository.isAuthenticated()) {\n // Store the current URL for redirection after re-authentication\n urlRedirectService.storeCurrentUrlIfAllowed();\n\n // Navigate to login page\n router.navigate([`/${environment.loginRoute}`]);\n }\n }\n\n // Re-throw the error so other error handlers can process it\n return throwError(() => error);\n }),\n );\n};\n","// src/lib/services/csrf-api.ts\nimport { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { firstValueFrom, map } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CsrfApi {\n private http = inject(HttpClient);\n private csrfToken: string | null = null;\n\n /**\n * Get CSRF token, fetching it if not available\n */\n async getCsrfToken(): Promise<string> {\n if (this.csrfToken) {\n return this.csrfToken;\n }\n\n try {\n this.csrfToken = await firstValueFrom(\n this.http\n .get<{ csrfToken: string }>('csrf-token')\n .pipe(map((response) => response.csrfToken)),\n );\n\n return this.csrfToken || '';\n } catch {\n // If CSRF endpoint fails, return empty token\n // Server should handle missing CSRF tokens appropriately\n return '';\n }\n }\n\n /**\n * Clear stored CSRF token (useful on logout)\n */\n clearCsrfToken(): void {\n this.csrfToken = null;\n }\n}\n","import { HttpInterceptorFn, HttpRequest, HttpContextToken } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { from } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { CsrfApi } from '../services/csrf-api';\n\n// A token to use with HttpContext for skipping CSRF token addition on specific requests.\nexport const SKIP_CSRF = new HttpContextToken<boolean>(() => false);\n\n/**\n * HTTP interceptor that automatically adds CSRF tokens to state-changing requests\n * Only applies to requests to the same origin to avoid leaking tokens to external APIs\n */\nexport const csrfInterceptor: HttpInterceptorFn = (req, next) => {\n const csrfService = inject(CsrfApi);\n\n // Check if CSRF should be skipped for this request\n const skipCsrf = req.context.get(SKIP_CSRF);\n if (skipCsrf) {\n return next(req);\n }\n\n // Only add CSRF token to state-changing requests (POST, PUT, PATCH, DELETE)\n const isStateChangingMethod = ['POST', 'PUT', 'PATCH', 'DELETE'].includes(\n req.method.toUpperCase(),\n );\n\n // Only add CSRF token to same-origin requests\n const isSameOrigin = isRequestToSameOrigin(req);\n\n if (isStateChangingMethod && isSameOrigin) {\n return from(csrfService.getCsrfToken()).pipe(\n switchMap((csrfToken) => {\n const modifiedReq = req.clone({\n setHeaders: {\n 'X-CSRF-Token': csrfToken,\n },\n });\n return next(modifiedReq);\n }),\n );\n }\n\n // For non-state-changing requests or external requests, proceed without modification\n return next(req);\n};\n\n/**\n * Checks if the request is going to the same origin as the current application\n */\nfunction isRequestToSameOrigin(req: HttpRequest<unknown>): boolean {\n try {\n const requestUrl = new URL(req.url, window.location.origin);\n return requestUrl.origin === window.location.origin;\n } catch {\n // If URL parsing fails, assume it's not same origin for security\n return false;\n }\n}\n","import { Provider } from '@angular/core';\nimport { AuthTokenRepositoryImpl } from '../repositories/auth-token-repository-impl';\nimport { AuthRepository } from '../domain/repositories/auth-repository';\nimport { AuthHttpRepository } from '../data/repositories/auth-http-repository';\nimport { AUTH_TOKEN } from '@acontplus/ng-config';\n\nexport const authProviders: Provider[] = [\n {\n provide: AuthRepository,\n useClass: AuthHttpRepository,\n },\n {\n provide: AUTH_TOKEN,\n useClass: AuthTokenRepositoryImpl,\n },\n];\n","// src/lib/providers/index.ts\nexport * from './auth-providers';\n","// src/lib/services/auth-state.ts\nimport { Injectable, inject, signal, OnDestroy, NgZone } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable, of, tap, catchError, throwError } from 'rxjs';\nimport { AuthRepository } from '../domain/repositories/auth-repository';\nimport { AuthTokenRepositoryImpl } from '../repositories/auth-token-repository-impl';\nimport { AuthUrlRedirect } from './auth-url-redirect';\nimport { AuthTokens, UserData, DecodedToken } from '@acontplus/core';\nimport { ENVIRONMENT } from '@acontplus/ng-config';\nimport {\n LoginRequest,\n RegisterRequest,\n ForgotPasswordRequest,\n ResetPasswordRequest,\n ChangePasswordRequest,\n VerifyEmailRequest,\n ResendVerificationRequest,\n MfaSetupResponse,\n VerifyMfaRequest,\n SocialLoginRequest,\n SocialProvider,\n SocialAuthUrl,\n DomainDiscoveryResponse,\n OAuthConfig,\n TenantConfig,\n} from '../domain/models/auth';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthState implements OnDestroy {\n private readonly authRepository = inject(AuthRepository);\n private readonly tokenRepository = inject(AuthTokenRepositoryImpl);\n private readonly router = inject(Router);\n private readonly ngZone = inject(NgZone);\n private readonly urlRedirectService = inject(AuthUrlRedirect);\n private readonly environment = inject(ENVIRONMENT);\n\n // Authentication state signals\n private readonly _isAuthenticated = signal<boolean>(false);\n private readonly _isLoading = signal<boolean>(false);\n private readonly _user = signal<UserData | null>(null);\n private readonly _mfaRequired = signal<boolean>(false);\n private readonly _emailVerified = signal<boolean>(true);\n\n // Public readonly signals\n readonly isAuthenticated = this._isAuthenticated.asReadonly();\n readonly isLoading = this._isLoading.asReadonly();\n readonly user = this._user.asReadonly();\n readonly mfaRequired = this._mfaRequired.asReadonly();\n readonly emailVerified = this._emailVerified.asReadonly();\n\n // Private refresh token timeout\n private refreshTokenTimeout?: number;\n private refreshInProgress$?: Observable<AuthTokens | null>;\n\n constructor() {\n this.initializeAuthentication();\n }\n\n // ============================================\n // Core Authentication\n // ============================================\n\n /**\n * Login with email and password\n */\n login(request: LoginRequest): Observable<AuthTokens> {\n this._isLoading.set(true);\n\n return this.authRepository.login(request).pipe(\n tap((tokens) => {\n this.setAuthenticated(tokens, request.rememberMe ?? false);\n this.urlRedirectService.redirectToIntendedUrl('/');\n }),\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Register a new user\n */\n register(request: RegisterRequest): Observable<AuthTokens> {\n this._isLoading.set(true);\n\n return this.authRepository.register(request).pipe(\n tap((tokens) => {\n this.setAuthenticated(tokens);\n this._emailVerified.set(false); // New users need email verification\n this.router.navigate(['/']);\n }),\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Logout user and clear all authentication data\n */\n logout(): Observable<void> {\n const userData = this.tokenRepository.getUserData();\n const refreshToken = this.tokenRepository.getRefreshToken();\n\n if (userData?.email && refreshToken && refreshToken.length > 0) {\n return this.authRepository.logout(userData.email, refreshToken).pipe(\n tap(() => this.performClientLogout()),\n catchError(() => {\n this.performClientLogout();\n return of(void 0);\n }),\n );\n }\n\n this.performClientLogout();\n return of(void 0);\n }\n\n /**\n * Refresh authentication tokens\n */\n refreshToken(): Observable<AuthTokens | null> {\n if (this.refreshInProgress$) {\n return this.refreshInProgress$;\n }\n\n const userData = this.tokenRepository.getUserData();\n const refreshToken = this.tokenRepository.getRefreshToken();\n\n if (!userData?.email || !refreshToken) {\n this.performClientLogout();\n return of(null);\n }\n\n this.refreshInProgress$ = this.authRepository\n .refreshToken({ email: userData.email, refreshToken })\n .pipe(\n tap((tokens) => {\n const rememberMe = this.tokenRepository.isRememberMeEnabled();\n this.setAuthenticated(tokens, rememberMe);\n }),\n catchError(() => {\n this.performClientLogout();\n return of(null);\n }),\n tap({\n complete: () => (this.refreshInProgress$ = undefined),\n error: () => (this.refreshInProgress$ = undefined),\n }),\n );\n\n return this.refreshInProgress$;\n }\n\n // ============================================\n // Password Management\n // ============================================\n\n /**\n * Request password reset email\n */\n forgotPassword(request: ForgotPasswordRequest): Observable<void> {\n this._isLoading.set(true);\n\n return this.authRepository.forgotPassword(request).pipe(\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Reset password with token\n */\n resetPassword(request: ResetPasswordRequest): Observable<void> {\n this._isLoading.set(true);\n\n return this.authRepository.resetPassword(request).pipe(\n tap(() => this.router.navigate([`/${this.environment.loginRoute}`])),\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Change password for authenticated user\n */\n changePassword(request: ChangePasswordRequest): Observable<void> {\n this._isLoading.set(true);\n\n return this.authRepository.changePassword(request).pipe(\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n // ============================================\n // Email Verification\n // ============================================\n\n /**\n * Verify email with token\n */\n verifyEmail(request: VerifyEmailRequest): Observable<void> {\n this._isLoading.set(true);\n\n return this.authRepository.verifyEmail(request).pipe(\n tap(() => this._emailVerified.set(true)),\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Resend verification email\n */\n resendVerificationEmail(request: ResendVerificationRequest): Observable<void> {\n this._isLoading.set(true);\n\n return this.authRepository.resendVerificationEmail(request).pipe(\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n // ============================================\n // MFA/2FA\n // ============================================\n\n /**\n * Setup MFA for authenticated user\n */\n setupMfa(): Observable<MfaSetupResponse> {\n this._isLoading.set(true);\n\n return this.authRepository.setupMfa().pipe(\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Verify MFA code and complete login\n */\n verifyMfa(request: VerifyMfaRequest): Observable<AuthTokens> {\n this._isLoading.set(true);\n\n return this.authRepository.verifyMfa(request).pipe(\n tap((tokens) => {\n this.setAuthenticated(tokens);\n this._mfaRequired.set(false);\n this.urlRedirectService.redirectToIntendedUrl('/');\n }),\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Disable MFA for authenticated user\n */\n disableMfa(code: string): Observable<void> {\n this._isLoading.set(true);\n\n return this.authRepository.disableMfa(code).pipe(\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n // ============================================\n // Social Login\n // ============================================\n\n /**\n * Get social authentication URL\n * @param provider - Social provider (google, microsoft, etc.)\n * @param config - Optional OAuth configuration with tenant/domain information\n */\n getSocialAuthUrl(\n provider: SocialProvider,\n config?: Partial<OAuthConfig>,\n ): Observable<SocialAuthUrl> {\n return this.authRepository.getSocialAuthUrl(provider, config);\n }\n\n /**\n * Complete social login with provider tokens\n */\n socialLogin(request: SocialLoginRequest): Observable<AuthTokens> {\n this._isLoading.set(true);\n\n return this.authRepository.socialLogin(request).pipe(\n tap((tokens) => {\n this.setAuthenticated(tokens, true);\n this.urlRedirectService.redirectToIntendedUrl('/');\n }),\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n // ============================================\n // Multi-Tenant / Domain Discovery\n // ============================================\n\n /**\n * Discover authentication method and tenant information based on email domain\n * This is useful for multi-tenant scenarios where different domains use different identity providers\n *\n * Example: User enters \"user@acme.com\" -> discovers it should use Google Workspace OAuth\n *\n * @param email - User's email address\n * @returns Discovery response with provider, tenant info, and authentication options\n */\n discoverDomain(email: string): Observable<DomainDiscoveryResponse> {\n this._isLoading.set(true);\n\n return this.authRepository.discoverDomain({ email }).pipe(\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Get tenant configuration for OAuth setup\n *\n * @param tenantId - Unique tenant identifier\n * @returns Tenant configuration including OAuth client ID, issuer, allowed domains, etc.\n */\n getTenantConfig(tenantId: string): Observable<TenantConfig> {\n return this.authRepository.getTenantConfig(tenantId);\n }\n\n /**\n * List all configured tenants (useful for selecting tenant in login UI)\n *\n * @returns Array of available tenant configurations\n */\n listTenants(): Observable<TenantConfig[]> {\n return this.authRepository.listTenants();\n }\n\n /**\n * Start OAuth flow for multi-tenant authentication\n * This method redirects the user to the provider's OAuth consent screen\n *\n * Example usage for Google Workspace:\n * ```typescript\n * authState.discoverDomain('user@acme.com').subscribe(discovery => {\n * if (discovery.requiresOAuth) {\n * authState.startOAuthFlow({\n * provider: discovery.provider!,\n * tenantId: discovery.tenantId,\n * domain: discovery.domain\n * });\n * }\n * });\n * ```\n *\n * @param config - OAuth configuration with provider, tenant, and domain information\n */\n startOAuthFlow(config: {\n provider: SocialProvider;\n tenantId?: string;\n domain?: string;\n redirectUri?: string;\n }): void {\n this._isLoading.set(true);\n\n this.getSocialAuthUrl(config.provider, config).subscribe({\n next: (authUrl) => {\n // Store OAuth state for callback verification\n if (authUrl.state) {\n sessionStorage.setItem('oauth_state', authUrl.state);\n }\n if (config.tenantId) {\n sessionStorage.setItem('oauth_tenant_id', config.tenantId);\n }\n if (config.domain) {\n sessionStorage.setItem('oauth_domain', config.domain);\n }\n\n // Redirect to provider OAuth consent screen\n window.location.href = authUrl.url;\n },\n error: (error) => {\n this._isLoading.set(false);\n console.error('Failed to get OAuth URL:', error);\n },\n });\n }\n\n /**\n * Handle OAuth callback after user returns from provider\n * Call this method in your OAuth callback component/route\n *\n * Example:\n * ```typescript\n * // In your callback component\n * ngOnInit() {\n * const params = new URLSearchParams(window.location.search);\n * const code = params.get('code');\n * const state = params.get('state');\n * const provider = 'google'; // or get from route params\n *\n * if (code && state) {\n * this.authState.handleOAuthCallback(provider, code, state).subscribe();\n * }\n * }\n * ```\n *\n * @param provider - Social provider that initiated the OAuth flow\n * @param code - Authorization code from OAuth callback\n * @param state - State parameter for CSRF protection\n * @returns Observable with authentication tokens\n */\n handleOAuthCallback(\n provider: SocialProvider,\n code: string,\n state: string,\n ): Observable<AuthTokens> {\n this._isLoading.set(true);\n\n // Verify state to prevent CSRF attacks\n const storedState = sessionStorage.getItem('oauth_state');\n if (storedState !== state) {\n this._isLoading.set(false);\n return throwError(() => new Error('Invalid OAuth state - possible CSRF attack'));\n }\n\n // Get stored OAuth context\n const tenantId = sessionStorage.getItem('oauth_tenant_id') || undefined;\n const domain = sessionStorage.getItem('oauth_domain') || undefined;\n\n // Clear stored OAuth data\n sessionStorage.removeItem('oauth_state');\n sessionStorage.removeItem('oauth_tenant_id');\n sessionStorage.removeItem('oauth_domain');\n\n // Complete social login\n return this.socialLogin({\n provider,\n code,\n state,\n tenantId,\n domain,\n });\n }\n\n // ============================================\n // State Management\n // ============================================\n\n /**\n * Set authentication state after successful login\n */\n setAuthenticated(tokens: AuthTokens, rememberMe = false): void {\n this.tokenRepository.saveTokens(tokens, rememberMe);\n this._isAuthenticated.set(true);\n const userData = this.tokenRepository.getUserData();\n this._user.set(userData);\n this.scheduleTokenRefresh();\n }\n\n /**\n * Check if user is authenticated\n */\n checkAuthentication(): boolean {\n const isAuthenticated = this.tokenRepository.isAuthenticated();\n this._isAuthenticated.set(isAuthenticated);\n\n if (!isAuthenticated) {\n this.performClientLogout();\n }\n\n return isAuthenticated;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private initializeAuthentication(): void {\n this._isLoading.set(true);\n\n try {\n const isAuthenticated = this.tokenRepository.isAuthenticated();\n this._isAuthenticated.set(isAuthenticated);\n\n if (isAuthenticated) {\n const userData = this.tokenRepository.getUserData();\n this._user.set(userData);\n this.scheduleTokenRefresh();\n }\n } catch {\n this.performClientLogout();\n } finally {\n this._isLoading.set(false);\n }\n }\n\n private scheduleTokenRefresh(): void {\n const accessToken = this.tokenRepository.getToken();\n if (!accessToken) {\n return;\n }\n\n try {\n const decodedToken = this.decodeToken(accessToken);\n const currentTime = Math.floor(Date.now() / 1000);\n const timeUntilExpiry = decodedToken.exp - currentTime;\n const refreshTime = Math.max((timeUntilExpiry - 300) * 1000, 1000);\n\n if (this.refreshTokenTimeout) {\n clearTimeout(this.refreshTokenTimeout);\n }\n\n this.ngZone.runOutsideAngular(() => {\n this.refreshTokenTimeout = window.setTimeout(() => {\n this.ngZone.run(() => {\n if (this.tokenRepository.needsRefresh()) {\n this.refreshToken().subscribe();\n }\n });\n }, refreshTime);\n });\n } catch {\n // Silent fail - token might be invalid\n }\n }\n\n private stopTokenRefreshTimer(): void {\n if (this.refreshTokenTimeout) {\n clearTimeout(this.refreshTokenTimeout);\n this.refreshTokenTimeout = undefined;\n }\n }\n\n private performClientLogout(): void {\n this.stopTokenRefreshTimer();\n this.tokenRepository.clearTokens();\n this._isAuthenticated.set(false);\n this._user.set(null);\n this._mfaRequired.set(false);\n this.router.navigate([`/${this.environment.loginRoute}`]);\n }\n\n private decodeToken(token: string): DecodedToken {\n try {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split('')\n .map((c) => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`)\n .join(''),\n );\n return JSON.parse(jsonPayload);\n } catch {\n throw new Error('Invalid token format');\n }\n }\n\n ngOnDestroy(): void {\n this.stopTokenRefreshTimer();\n }\n}\n","// src/lib/presentation/components/login/login.ts\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n signal,\n computed,\n OnInit,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n FormGroup,\n FormBuilder,\n Validators,\n ReactiveFormsModule,\n AbstractControl,\n} from '@angular/forms';\nimport {\n MatCard,\n MatCardContent,\n MatCardFooter,\n MatCardHeader,\n MatCardTitle,\n} from '@angular/material/card';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatInput } from '@angular/material/input';\nimport { MatIcon, MatIconRegistry } from '@angular/material/icon';\nimport { MatAnchor, MatButton } from '@angular/material/button';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { MatDivider } from '@angular/material/divider';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { AuthState } from '../../services/auth-state';\nimport { LoggingService } from '@acontplus/ng-infrastructure';\nimport { DomainDiscoveryResponse, SocialProvider } from '../../domain/models/auth';\nimport { DEFAULT_ICONS } from '@acontplus/ui-kit';\n\n@Component({\n selector: 'acp-login',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatCard,\n MatCardHeader,\n MatLabel,\n MatCardTitle,\n MatCardContent,\n MatFormField,\n MatInput,\n MatIcon,\n MatButton,\n MatCardFooter,\n MatAnchor,\n MatCheckbox,\n MatDivider,\n ],\n templateUrl: './login.html',\n styleUrls: ['./login.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class Login implements OnInit {\n title = input<string>('Login');\n showRegisterButton = input<boolean>(true);\n showRememberMe = input<boolean>(true);\n enableDomainDiscovery = input<boolean>(false); // Enable multi-tenant domain discovery\n showSocialLogin = input<boolean>(true); // Show social login buttons\n\n // Additional form controls that can be passed from parent components\n additionalSigninControls = input<Record<string, AbstractControl>>({});\n additionalSignupControls = input<Record<string, AbstractControl>>({});\n\n // Additional field templates\n additionalSigninFields = input<TemplateRef<unknown> | null>(null);\n additionalSignupFields = input<TemplateRef<unknown> | null>(null);\n\n // Footer content template\n footerContent = input<TemplateRef<unknown> | null>(null);\n\n // Computed signal to check if footer content exists\n hasFooterContent = computed(() => this.footerContent() !== null);\n\n private readonly fb = inject(FormBuilder);\n private readonly authState = inject(AuthState);\n private readonly loggingService = inject(LoggingService);\n private readonly iconRegistry = inject(MatIconRegistry);\n private readonly sanitizer = inject(DomSanitizer);\n\n // Angular 20+ signals\n isLoginMode = signal(true);\n isLoading = signal(false);\n errorMessage = signal<string | null>(null);\n discoveryResult = signal<DomainDiscoveryResponse | null>(null);\n showPasswordLogin = signal(true);\n\n signinForm: FormGroup;\n signupForm: FormGroup;\n\n constructor() {\n // Register social login icons\n this.registerSocialIcons();\n\n this.signinForm = this.fb.group({\n email: ['', [Validators.required, Validators.email]],\n password: ['', Validators.required],\n rememberMe: [false], // Default to false (unchecked)\n });\n\n this.signupForm = this.fb.group({\n displayName: ['', Validators.required],\n email: ['', [Validators.required, Validators.email]],\n password: ['', [Validators.required, Validators.minLength(6)]],\n });\n }\n\n private registerSocialIcons(): void {\n const socialIconNames = ['google', 'microsoft', 'github', 'facebook', 'apple', 'linkedin'];\n socialIconNames.forEach((name) => {\n const icon = DEFAULT_ICONS.find((i) => i.name === name);\n if (icon) {\n this.iconRegistry.addSvgIconLiteral(\n name,\n this.sanitizer.bypassSecurityTrustHtml(icon.data)\n );\n }\n });\n }\n\n ngOnInit(): void {\n // Handle rememberMe control based on showRememberMe input\n if (!this.showRememberMe()) {\n // Remove rememberMe control if not needed\n this.signinForm.removeControl('rememberMe');\n }\n\n // Add additional controls to signin form\n Object.entries(this.additionalSigninControls()).forEach(([key, control]) => {\n this.signinForm.addControl(key, control);\n });\n\n // Add additional controls to signup form\n Object.entries(this.additionalSignupControls()).forEach(([key, control]) => {\n this.signupForm.addControl(key, control);\n });\n\n // Set up domain discovery on email change if enabled\n if (this.enableDomainDiscovery()) {\n this.signinForm.get('email')?.valueChanges.subscribe((email: string) => {\n if (email && this.isValidEmail(email)) {\n this.checkDomain(email);\n }\n });\n }\n }\n\n private isValidEmail(email: string): boolean {\n const emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailPattern.test(email);\n }\n\n private checkDomain(email: string): void {\n this.authState.discoverDomain(email).subscribe({\n next: (result) => {\n this.discoveryResult.set(result);\n this.showPasswordLogin.set(result.allowPasswordLogin);\n\n // If domain requires OAuth and doesn't allow password login, hide password field\n if (result.requiresOAuth && !result.allowPasswordLogin) {\n this.signinForm.get('password')?.disable();\n } else {\n this.signinForm.get('password')?.enable();\n }\n },\n error: (err) => {\n // Silently handle discovery errors - fallback to standard login\n this.loggingService.warn('Domain discovery failed', { error: err });\n this.discoveryResult.set(null);\n this.showPasswordLogin.set(true);\n },\n });\n }\n\n switchMode(): void {\n this.isLoginMode.set(!this.isLoginMode());\n this.errorMessage.set(null);\n }\n\n signIn(): void {\n if (this.signinForm.valid) {\n this.isLoading.set(true);\n this.errorMessage.set(null);\n\n // Prepare login request with rememberMe handling\n const loginRequest = {\n ...this.signinForm.value,\n // If showRememberMe is false, default rememberMe to false\n rememberMe: this.showRememberMe() ? (this.signinForm.value.rememberMe ?? false) : false,\n };\n\n this.authState.login(loginRequest).subscribe({\n next: () => {\n this.isLoading.set(false);\n },\n error: (error) => {\n this.isLoading.set(false);\n this.errorMessage.set('Error al iniciar sesión. Verifique sus credenciales.');\n this.loggingService.error('Login failed', { error });\n },\n });\n }\n }\n\n registerUser(): void {\n if (this.signupForm.valid) {\n this.isLoading.set(true);\n this.errorMessage.set(null);\n\n this.authState.register(this.signupForm.value).subscribe({\n next: () => {\n this.isLoading.set(false);\n this.signupForm.reset();\n this.isLoginMode.set(true);\n },\n error: (error) => {\n this.isLoading.set(false);\n this.errorMessage.set('Error al registrar usuario. Intente nuevamente.');\n this.loggingService.error('Register error', { error });\n },\n });\n }\n }\n\n /**\n * Start OAuth flow for discovered provider or specified provider\n */\n loginWithProvider(provider?: SocialProvider): void {\n const discovery = this.discoveryResult();\n const finalProvider = provider || discovery?.provider;\n\n if (!finalProvider) {\n this.errorMessage.set('No authentication provider configured');\n return;\n }\n\n this.isLoading.set(true);\n this.errorMessage.set(null);\n\n this.authState.startOAuthFlow({\n provider: finalProvider,\n tenantId: discovery?.tenantId,\n domain: discovery?.domain,\n });\n }\n\n /**\n * Handle direct social login button clicks\n */\n socialLogin(provider: SocialProvider): void {\n this.loginWithProvider(provider);\n }\n}\n","<mat-card class=\"mat-elevation-z8 p-4 rounded\">\n <mat-card-header>\n <mat-card-title class=\"text-center\">{{ title() }}</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n @if (isLoginMode()) {\n <form [formGroup]=\"signinForm\" (ngSubmit)=\"signIn()\" class=\"d-flex flex-column gap-3\">\n <mat-form-field class=\"w-100\">\n <mat-label>Usuario</mat-label>\n <input matInput type=\"text\" placeholder=\"Ingrese su usuario\" formControlName=\"email\" />\n </mat-form-field>\n\n <!-- Show discovery message if OAuth is required -->\n @if (enableDomainDiscovery() && discoveryResult() && discoveryResult()!.requiresOAuth) {\n <div class=\"discovery-message\">\n @if (discoveryResult()!.provider) {\n <p>\n <mat-icon>info</mat-icon>\n Su organización utiliza {{ discoveryResult()!.provider }} para la autenticación\n </p>\n @if (!discoveryResult()!.allowPasswordLogin) {\n <p class=\"warning\">Por favor, use el botón de inicio de sesión corporativo</p>\n }\n }\n </div>\n }\n\n <!-- Password field - only show if allowed -->\n @if (showPasswordLogin()) {\n <mat-form-field class=\"w-100\">\n <mat-label>Contraseña</mat-label>\n <input\n matInput\n type=\"password\"\n placeholder=\"Ingrese su contraseña\"\n formControlName=\"password\"\n autocomplete=\"current-password\"\n />\n </mat-form-field>\n\n <!-- Remember Me checkbox - conditional -->\n @if (showRememberMe()) {\n <div class=\"d-flex align-items-center mt-2\">\n <mat-checkbox formControlName=\"rememberMe\"> Recordarme </mat-checkbox>\n </div>\n }\n\n <!-- Additional signin fields -->\n <ng-container *ngTemplateOutlet=\"additionalSigninFields()\"></ng-container>\n\n <div class=\"d-flex justify-content-center mt-3\">\n <button\n mat-raised-button\n color=\"primary\"\n [disabled]=\"!signinForm.valid || isLoading()\"\n type=\"submit\"\n class=\"w-100\"\n >\n @if (isLoading()) {\n Ingresando...\n } @else {\n <ng-container>Ingresar <mat-icon>login</mat-icon></ng-container>\n }\n </button>\n </div>\n }\n\n <!-- OAuth/SSO Login Buttons -->\n @if (\n enableDomainDiscovery() &&\n discoveryResult() &&\n discoveryResult()!.requiresOAuth &&\n discoveryResult()!.provider\n ) {\n <div class=\"d-flex justify-content-center mt-3\">\n <button\n mat-raised-button\n color=\"accent\"\n type=\"button\"\n (click)=\"loginWithProvider()\"\n class=\"w-100 oauth-button\"\n [disabled]=\"isLoading()\"\n >\n <mat-icon>business</mat-icon>\n Iniciar sesión con {{ discoveryResult()!.provider }}\n </button>\n </div>\n }\n\n <!-- Social Login Divider -->\n @if (showSocialLogin() && showPasswordLogin()) {\n <mat-divider class=\"my-3\"></mat-divider>\n <p class=\"text-center text-muted\">O continuar con</p>\n }\n\n <!-- Social Login Buttons -->\n @if (showSocialLogin() && !discoveryResult()?.requiresOAuth) {\n <div class=\"social-login-buttons\">\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"socialLogin('google')\"\n class=\"w-100 social-button\"\n [disabled]=\"isLoading()\"\n >\n <mat-icon svgIcon=\"google\"></mat-icon>\n Google\n </button>\n\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"socialLogin('microsoft')\"\n class=\"w-100 social-button\"\n [disabled]=\"isLoading()\"\n >\n <mat-icon svgIcon=\"microsoft\"></mat-icon>\n Microsoft\n </button>\n\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"socialLogin('github')\"\n class=\"w-100 social-button\"\n [disabled]=\"isLoading()\"\n >\n <mat-icon svgIcon=\"github\"></mat-icon>\n GitHub\n </button>\n </div>\n }\n\n <div class=\"text-center mt-2\">\n @if (showRegisterButton()) {\n <button mat-button type=\"button\" (click)=\"switchMode()\">\n ¿No tienes cuenta? Regístrate\n </button>\n }\n </div>\n </form>\n } @else {\n <form [formGroup]=\"signupForm\" (ngSubmit)=\"registerUser()\" class=\"d-flex flex-column gap-3\">\n <mat-form-field class=\"w-100\">\n <mat-label>Nombre</mat-label>\n <input\n matInput\n type=\"text\"\n placeholder=\"Ingrese su nombre\"\n formControlName=\"displayName\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"w-100\">\n <mat-label>Email</mat-label>\n <input matInput type=\"email\" placeholder=\"Ingrese su email\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field class=\"w-100\">\n <mat-label>Contraseña</mat-label>\n <input\n matInput\n type=\"password\"\n placeholder=\"Ingrese su contraseña\"\n formControlName=\"password\"\n autocomplete=\"new-password\"\n />\n </mat-form-field>\n\n <!-- Additional signup fields -->\n <ng-container *ngTemplateOutlet=\"additionalSignupFields()\"></ng-container>\n\n <div class=\"d-flex justify-content-center mt-3\">\n <button\n mat-raised-button\n color=\"primary\"\n [disabled]=\"!signupForm.valid || isLoading()\"\n type=\"submit\"\n class=\"w-100\"\n >\n @if (isLoading()) {\n Registrando...\n } @else {\n <ng-container>Registrarse <mat-icon>person_add</mat-icon></ng-container>\n }\n </button>\n </div>\n\n <div class=\"text-center mt-2\">\n <button mat-button type=\"button\" (click)=\"switchMode()\">\n ¿Ya tienes cuenta? Inicia sesión\n </button>\n </div>\n </form>\n }\n @if (errorMessage()) {\n <div class=\"alert alert-danger mt-3\" role=\"alert\">{{ errorMessage() }}</div>\n }\n </mat-card-content>\n @if (hasFooterContent()) {\n <mat-card-footer>\n <ng-container *ngTemplateOutlet=\"footerContent()\"></ng-container>\n </mat-card-footer>\n }\n</mat-card>\n","// src/lib/presentation/components/index.ts\nexport { Login } from './login';\n","// src/lib/ui/oauth-callback/oauth-callback.ts\nimport { Component, OnInit, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { AuthState } from '../../services/auth-state';\nimport { SocialProvider } from '../../domain/models/auth';\n\n/**\n * OAuth Callback Component\n *\n * This component handles the OAuth callback after user authenticates with external provider.\n * It extracts the authorization code and state from URL parameters, verifies them,\n * and completes the authentication flow.\n *\n * Usage:\n * 1. Register this component in your routes:\n * ```typescript\n * {\n * path: 'auth/callback/:provider',\n * component: OAuthCallbackComponent\n * }\n * ```\n *\n * 2. Configure OAuth redirect URI in your backend:\n * ```\n * https://your-app.com/auth/callback/google\n * https://your-app.com/auth/callback/microsoft\n * ```\n *\n * The component will:\n * - Extract provider from route params\n * - Extract code and state from query params\n * - Validate state for CSRF protection\n * - Complete OAuth login flow\n * - Redirect to intended URL or home page\n * - Show error message if authentication fails\n */\n@Component({\n selector: 'acp-oauth-callback',\n standalone: true,\n imports: [MatProgressSpinnerModule],\n template: `\n <div class=\"oauth-callback-container\">\n @if (loading) {\n <mat-spinner diameter=\"48\"></mat-spinner>\n <p>Completing authentication...</p>\n }\n\n @if (error) {\n <div class=\"error-message\">\n <h2>Authentication Failed</h2>\n <p>{{ error }}</p>\n <button (click)=\"goToLogin()\">Return to Login</button>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .oauth-callback-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n padding: 2rem;\n text-align: center;\n }\n\n mat-spinner {\n margin-bottom: 1.5rem;\n }\n\n p {\n font-size: 1rem;\n color: #666;\n margin: 0;\n }\n\n .error-message {\n max-width: 400px;\n }\n\n .error-message h2 {\n color: #d32f2f;\n margin-bottom: 1rem;\n }\n\n .error-message p {\n color: #666;\n margin-bottom: 2rem;\n }\n\n .error-message button {\n padding: 0.75rem 2rem;\n background-color: #1976d2;\n color: white;\n border: none;\n border-radius: 4px;\n font-size: 1rem;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .error-message button:hover {\n background-color: #1565c0;\n }\n `,\n ],\n})\nexport class OAuthCallbackComponent implements OnInit {\n private readonly authState = inject(AuthState);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n loading = true;\n error: string | null = null;\n\n ngOnInit(): void {\n this.handleCallback();\n }\n\n private handleCallback(): void {\n // Get provider from route params\n const provider = this.route.snapshot.paramMap.get('provider') as SocialProvider;\n\n // Get OAuth callback params from query string\n const code = this.route.snapshot.queryParamMap.get('code');\n const state = this.route.snapshot.queryParamMap.get('state');\n const error = this.route.snapshot.queryParamMap.get('error');\n const errorDescription = this.route.snapshot.queryParamMap.get('error_description');\n\n // Check for OAuth errors\n if (error) {\n this.loading = false;\n this.error = errorDescription || `OAuth error: ${error}`;\n console.error('OAuth error:', { error, errorDescription });\n return;\n }\n\n // Validate required parameters\n if (!provider) {\n this.loading = false;\n this.error = 'Missing provider in callback URL';\n console.error('OAuth callback error: Missing provider');\n return;\n }\n\n if (!code || !state) {\n this.loading = false;\n this.error = 'Missing authorization code or state parameter';\n console.error('OAuth callback error: Missing code or state');\n return;\n }\n\n // Complete OAuth flow\n this.authState.handleOAuthCallback(provider, code, state).subscribe({\n next: () => {\n this.loading = false;\n // AuthState will handle redirect via urlRedirectService\n },\n error: (err) => {\n this.loading = false;\n this.error = err.error?.message || err.message || 'Authentication failed';\n console.error('OAuth callback error:', err);\n },\n });\n }\n\n goToLogin(): void {\n this.router.navigate(['/auth/login']);\n }\n}\n","// src/lib/ui/oauth-callback/index.ts\nexport * from './oauth-callback';\n","// src/lib/ui/index.ts\nexport * from './login';\nexport * from './oauth-callback';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["catchError","i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acontplus-ng-auth.mjs","sources":["../../../../packages/ng-auth/src/lib/domain/repositories/auth-repository.ts","../../../../packages/ng-auth/src/lib/data/repositories/auth-http-repository.ts","../../../../packages/ng-auth/src/lib/data/repositories/index.ts","../../../../packages/ng-auth/src/lib/data/index.ts","../../../../packages/ng-auth/src/lib/domain/models/auth.ts","../../../../packages/ng-auth/src/lib/domain/models/index.ts","../../../../packages/ng-auth/src/lib/domain/repositories/index.ts","../../../../packages/ng-auth/src/lib/repositories/auth-token-repository-impl.ts","../../../../packages/ng-auth/src/lib/services/auth-url-redirect.ts","../../../../packages/ng-auth/src/lib/guards/auth-guard.ts","../../../../packages/ng-auth/src/lib/interceptors/auth-redirect-interceptor.ts","../../../../packages/ng-auth/src/lib/services/csrf-api.ts","../../../../packages/ng-auth/src/lib/interceptors/csrf-interceptor.ts","../../../../packages/ng-auth/src/lib/providers/auth-providers.ts","../../../../packages/ng-auth/src/lib/providers/index.ts","../../../../packages/ng-auth/src/lib/services/auth-state.ts","../../../../packages/ng-auth/src/lib/ui/login/login.ts","../../../../packages/ng-auth/src/lib/ui/login/login.html","../../../../packages/ng-auth/src/lib/ui/login/index.ts","../../../../packages/ng-auth/src/lib/ui/oauth-callback/oauth-callback.ts","../../../../packages/ng-auth/src/lib/ui/oauth-callback/index.ts","../../../../packages/ng-auth/src/lib/ui/index.ts","../../../../packages/ng-auth/src/acontplus-ng-auth.ts"],"sourcesContent":["// src/lib/domain/repositories/auth-repository.ts\nimport { Observable } from 'rxjs';\nimport {\n LoginRequest,\n RegisterRequest,\n RefreshTokenRequest,\n ForgotPasswordRequest,\n ResetPasswordRequest,\n ChangePasswordRequest,\n VerifyEmailRequest,\n ResendVerificationRequest,\n MfaSetupResponse,\n VerifyMfaRequest,\n SocialLoginRequest,\n SocialProvider,\n SocialAuthUrl,\n DomainDiscoveryRequest,\n DomainDiscoveryResponse,\n OAuthConfig,\n TenantConfig,\n} from '../models/auth';\nimport { AuthTokens } from '@acontplus/core';\n\nexport abstract class AuthRepository {\n // Core Authentication\n abstract login(request: LoginRequest): Observable<AuthTokens>;\n abstract register(request: RegisterRequest): Observable<AuthTokens>;\n abstract refreshToken(request: RefreshTokenRequest): Observable<AuthTokens>;\n abstract logout(email: string, refreshToken: string): Observable<void>;\n\n // Password Management\n abstract forgotPassword(request: ForgotPasswordRequest): Observable<void>;\n abstract resetPassword(request: ResetPasswordRequest): Observable<void>;\n abstract changePassword(request: ChangePasswordRequest): Observable<void>;\n\n // Email Verification\n abstract verifyEmail(request: VerifyEmailRequest): Observable<void>;\n abstract resendVerificationEmail(request: ResendVerificationRequest): Observable<void>;\n\n // MFA/2FA\n abstract setupMfa(): Observable<MfaSetupResponse>;\n abstract verifyMfa(request: VerifyMfaRequest): Observable<AuthTokens>;\n abstract disableMfa(code: string): Observable<void>;\n\n // Social Login\n abstract getSocialAuthUrl(\n provider: SocialProvider,\n config?: Partial<OAuthConfig>,\n ): Observable<SocialAuthUrl>;\n abstract socialLogin(request: SocialLoginRequest): Observable<AuthTokens>;\n\n // Multi-Tenant / Domain Discovery\n abstract discoverDomain(request: DomainDiscoveryRequest): Observable<DomainDiscoveryResponse>;\n abstract getTenantConfig(tenantId: string): Observable<TenantConfig>;\n abstract listTenants(): Observable<TenantConfig[]>;\n}\n","// src/lib/data/repositories/auth-http-repository.ts\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { AuthRepository } from '../../domain/repositories/auth-repository';\nimport {\n LoginRequest,\n RegisterRequest,\n RefreshTokenRequest,\n ForgotPasswordRequest,\n ResetPasswordRequest,\n ChangePasswordRequest,\n VerifyEmailRequest,\n ResendVerificationRequest,\n MfaSetupResponse,\n VerifyMfaRequest,\n SocialLoginRequest,\n SocialProvider,\n SocialAuthUrl,\n DomainDiscoveryRequest,\n DomainDiscoveryResponse,\n OAuthConfig,\n TenantConfig,\n} from '../../domain/models/auth';\nimport { AuthTokens } from '@acontplus/core';\nimport { AUTH_API } from '@acontplus/ng-config';\n\nfunction getDeviceInfo(): string {\n return `${navigator.platform ?? 'Unknown'} - ${navigator.userAgent}`;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthHttpRepository extends AuthRepository {\n private readonly http = inject(HttpClient);\n private readonly URL = `${AUTH_API.AUTH}`;\n\n // Core Authentication\n login(request: LoginRequest): Observable<AuthTokens> {\n return this.http.post<AuthTokens>(`${this.URL}login`, request, {\n headers: { 'Device-Info': getDeviceInfo() },\n withCredentials: true,\n });\n }\n\n register(request: RegisterRequest): Observable<AuthTokens> {\n return this.http.post<AuthTokens>(`${this.URL}register`, request, {\n headers: { 'Device-Info': getDeviceInfo() },\n withCredentials: true,\n });\n }\n\n refreshToken(request: RefreshTokenRequest): Observable<AuthTokens> {\n return this.http.post<AuthTokens>(`${this.URL}refresh`, request, {\n headers: { 'Device-Info': getDeviceInfo() },\n withCredentials: true,\n });\n }\n\n logout(email: string, refreshToken: string): Observable<void> {\n return this.http.post<void>(\n `${this.URL}logout`,\n { email, refreshToken: refreshToken || undefined },\n { withCredentials: true },\n );\n }\n\n // Password Management\n forgotPassword(request: ForgotPasswordRequest): Observable<void> {\n return this.http.post<void>(`${this.URL}forgot-password`, request);\n }\n\n resetPassword(request: ResetPasswordRequest): Observable<void> {\n return this.http.post<void>(`${this.URL}reset-password`, request);\n }\n\n changePassword(request: ChangePasswordRequest): Observable<void> {\n return this.http.post<void>(`${this.URL}change-password`, request, {\n withCredentials: true,\n });\n }\n\n // Email Verification\n verifyEmail(request: VerifyEmailRequest): Observable<void> {\n return this.http.post<void>(`${this.URL}verify-email`, request);\n }\n\n resendVerificationEmail(request: ResendVerificationRequest): Observable<void> {\n return this.http.post<void>(`${this.URL}resend-verification`, request);\n }\n\n // MFA/2FA\n setupMfa(): Observable<MfaSetupResponse> {\n return this.http.post<MfaSetupResponse>(`${this.URL}mfa/setup`, null, {\n withCredentials: true,\n });\n }\n\n verifyMfa(request: VerifyMfaRequest): Observable<AuthTokens> {\n return this.http.post<AuthTokens>(`${this.URL}mfa/verify`, request, {\n headers: { 'Device-Info': getDeviceInfo() },\n withCredentials: true,\n });\n }\n\n disableMfa(code: string): Observable<void> {\n return this.http.post<void>(`${this.URL}mfa/disable`, { code }, { withCredentials: true });\n }\n\n // Social Login\n getSocialAuthUrl(\n provider: SocialProvider,\n config?: Partial<OAuthConfig>,\n ): Observable<SocialAuthUrl> {\n const params: Record<string, string> = {};\n if (config?.tenantId) params['tenantId'] = config.tenantId;\n if (config?.domain) params['domain'] = config.domain;\n if (config?.redirectUri) params['redirectUri'] = config.redirectUri;\n\n const queryString =\n Object.keys(params).length > 0 ? '?' + new URLSearchParams(params).toString() : '';\n\n return this.http.get<SocialAuthUrl>(`${this.URL}social/${provider}/url${queryString}`);\n }\n\n socialLogin(request: SocialLoginRequest): Observable<AuthTokens> {\n return this.http.post<AuthTokens>(`${this.URL}social/${request.provider}/callback`, request, {\n headers: { 'Device-Info': getDeviceInfo() },\n withCredentials: true,\n });\n }\n\n // Multi-Tenant / Domain Discovery\n discoverDomain(request: DomainDiscoveryRequest): Observable<DomainDiscoveryResponse> {\n return this.http.post<DomainDiscoveryResponse>(`${this.URL}domain-discovery`, request);\n }\n\n getTenantConfig(tenantId: string): Observable<TenantConfig> {\n return this.http.get<TenantConfig>(`${this.URL}tenants/${tenantId}`);\n }\n\n listTenants(): Observable<TenantConfig[]> {\n return this.http.get<TenantConfig[]>(`${this.URL}tenants`);\n }\n}\n","// src/lib/data/repositories/index.ts\nexport * from './auth-http-repository';\n","// src/lib/data/index.ts\nexport * from './repositories';\n","// src/lib/domain/models/auth.ts\n\nexport interface LoginRequest {\n email: string;\n password: string;\n rememberMe?: boolean;\n}\n\nexport interface RegisterRequest {\n email: string;\n displayName: string;\n password: string;\n}\n\nexport interface RefreshTokenRequest {\n email: string;\n refreshToken: string;\n}\n\n// Password Reset\nexport interface ForgotPasswordRequest {\n email: string;\n}\n\nexport interface ResetPasswordRequest {\n token: string;\n newPassword: string;\n}\n\nexport interface ChangePasswordRequest {\n currentPassword: string;\n newPassword: string;\n}\n\n// Email Verification\nexport interface VerifyEmailRequest {\n token: string;\n}\n\nexport interface ResendVerificationRequest {\n email: string;\n}\n\n// MFA/2FA\nexport interface MfaSetupResponse {\n secret: string;\n qrCodeUrl: string;\n backupCodes: string[];\n}\n\nexport interface VerifyMfaRequest {\n code: string;\n email: string;\n}\n\nexport interface LoginWithMfaRequest extends LoginRequest {\n mfaCode?: string;\n}\n\n// Social Login\nexport type SocialProvider = 'google' | 'microsoft' | 'github' | 'facebook' | 'apple' | 'linkedin';\n\nexport interface SocialLoginRequest {\n provider: SocialProvider;\n\n // OAuth 2.0 Authorization Code Flow\n code?: string; // Authorization code from OAuth callback\n state?: string; // CSRF state verification\n\n // Legacy Token-based Flow (for direct token exchange)\n accessToken?: string;\n idToken?: string;\n\n // Multi-tenant context\n domain?: string; // For multi-tenant scenarios\n tenantId?: string; // For Azure AD, Google Workspace\n}\n\nexport interface SocialAuthUrl {\n url: string;\n state: string;\n}\n\n// Multi-Tenant OAuth / Domain-based Auth\nexport interface TenantConfig {\n tenantId: string;\n domain: string;\n displayName: string;\n provider: SocialProvider;\n clientId?: string;\n issuer?: string; // OIDC issuer URL\n allowedDomains?: string[]; // Email domains allowed for this tenant\n customParameters?: Record<string, string>;\n}\n\nexport interface DomainDiscoveryRequest {\n email: string;\n}\n\nexport interface DomainDiscoveryResponse {\n provider?: SocialProvider;\n tenantId?: string;\n domain?: string;\n discoveryUrl?: string;\n requiresOAuth: boolean;\n allowPasswordLogin: boolean;\n}\n\nexport interface OAuthConfig {\n provider: SocialProvider;\n clientId: string;\n redirectUri: string;\n scope: string;\n responseType: 'code' | 'token' | 'id_token' | 'code id_token';\n responseMode?: 'query' | 'fragment' | 'form_post';\n tenantId?: string; // Azure AD, Google Workspace tenant\n domain?: string; // Domain hint\n prompt?: 'none' | 'login' | 'consent' | 'select_account';\n loginHint?: string; // Email hint\n state?: string;\n nonce?: string;\n additionalParams?: Record<string, string>;\n}\n\nexport interface OAuthCallbackParams {\n code?: string;\n state?: string;\n error?: string;\n error_description?: string;\n id_token?: string;\n access_token?: string;\n}\n\n// Auth Status\nexport interface AuthStatus {\n isAuthenticated: boolean;\n mfaRequired: boolean;\n emailVerified: boolean;\n}\n","// src/lib/domain/repositories/index.ts\nexport * from './auth';\n","// src/lib/domain/repositories/index.ts\nexport * from './auth-repository';\n","import { Injectable, inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { jwtDecode } from 'jwt-decode';\nimport { AuthTokens, UserData } from '@acontplus/core';\nimport { AuthTokenRepository, ENVIRONMENT } from '@acontplus/ng-config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthTokenRepositoryImpl implements AuthTokenRepository {\n private environment = inject(ENVIRONMENT);\n private platformId = inject(PLATFORM_ID);\n\n saveTokens(tokens: AuthTokens, rememberMe = false): void {\n if (isPlatformBrowser(this.platformId)) {\n this.setToken(tokens.token, rememberMe);\n this.setRefreshToken(tokens.refreshToken, rememberMe);\n }\n }\n\n getToken(): string | null {\n if (!isPlatformBrowser(this.platformId)) {\n return null;\n }\n return (\n localStorage.getItem(this.environment.tokenKey) ||\n sessionStorage.getItem(this.environment.tokenKey)\n );\n }\n\n getRefreshToken(): string | null {\n if (!isPlatformBrowser(this.platformId)) {\n return null;\n }\n return (\n localStorage.getItem(this.environment.refreshTokenKey) ||\n sessionStorage.getItem(this.environment.refreshTokenKey)\n );\n }\n\n setToken(token: string, rememberMe = false): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n if (rememberMe) {\n localStorage.setItem(this.environment.tokenKey, token);\n // Clear from sessionStorage to avoid conflicts\n sessionStorage.removeItem(this.environment.tokenKey);\n } else {\n sessionStorage.setItem(this.environment.tokenKey, token);\n // Clear from localStorage to avoid conflicts\n localStorage.removeItem(this.environment.tokenKey);\n }\n }\n\n setRefreshToken(refreshToken: string, rememberMe = false): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n if (rememberMe) {\n localStorage.setItem(this.environment.refreshTokenKey, refreshToken);\n // Clear from sessionStorage to avoid conflicts\n sessionStorage.removeItem(this.environment.refreshTokenKey);\n } else {\n sessionStorage.setItem(this.environment.refreshTokenKey, refreshToken);\n // Clear from localStorage to avoid conflicts\n localStorage.removeItem(this.environment.refreshTokenKey);\n }\n }\n\n clearTokens(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n localStorage.removeItem(this.environment.tokenKey);\n localStorage.removeItem(this.environment.refreshTokenKey);\n sessionStorage.removeItem(this.environment.tokenKey);\n sessionStorage.removeItem(this.environment.refreshTokenKey);\n }\n\n isAuthenticated(): boolean {\n const accessToken = this.getToken();\n\n if (!accessToken) {\n return false;\n }\n\n try {\n const decodedAccessToken = jwtDecode(accessToken);\n const accessExpiration = Number(decodedAccessToken.exp);\n const currentTimeUTC = Math.floor(Date.now() / 1000);\n\n return accessExpiration > currentTimeUTC;\n } catch {\n return false;\n }\n }\n\n needsRefresh(): boolean {\n const accessToken = this.getToken();\n if (!accessToken) {\n return false;\n }\n\n try {\n const decodedToken = jwtDecode(accessToken);\n const expiration = Number(decodedToken.exp);\n const currentTimeUTC = Math.floor(Date.now() / 1000);\n const timeUntilExpiry = expiration - currentTimeUTC;\n\n return timeUntilExpiry <= 300; // 5 minutes\n } catch {\n return false;\n }\n }\n\n getTokenPayload(): unknown {\n const token = this.getToken();\n if (!token) return null;\n\n try {\n return jwtDecode(token);\n } catch {\n return null;\n }\n }\n\n /**\n * Determines if tokens are stored persistently (localStorage) vs session (sessionStorage)\n */\n isRememberMeEnabled(): boolean {\n if (!isPlatformBrowser(this.platformId)) {\n return false;\n }\n\n // Check if tokens exist in localStorage (persistent storage)\n const tokenInLocalStorage = localStorage.getItem(this.environment.tokenKey);\n const refreshTokenInLocalStorage = localStorage.getItem(this.environment.refreshTokenKey);\n\n return !!(tokenInLocalStorage || refreshTokenInLocalStorage);\n }\n\n getUserData(): UserData | null {\n const token = this.getToken();\n if (!token) {\n return null;\n }\n\n try {\n const decodedToken = jwtDecode<Record<string, unknown>>(token);\n\n const email =\n decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'] ??\n decodedToken['email'] ??\n decodedToken['sub'] ??\n decodedToken['user_id'];\n\n const displayName =\n decodedToken['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname'] ??\n decodedToken['displayName'] ??\n decodedToken['display_name'] ??\n decodedToken['name'] ??\n decodedToken['given_name'];\n\n const name = decodedToken['name'] ?? displayName;\n\n if (!email) {\n return null;\n }\n\n const userData: UserData = {\n email: email.toString(),\n displayName: displayName?.toString() ?? 'Unknown User',\n name: name?.toString(),\n roles: this.extractArrayField(decodedToken, ['roles', 'role']),\n permissions: this.extractArrayField(decodedToken, ['permissions', 'perms']),\n tenantId:\n decodedToken['tenantId']?.toString() ??\n decodedToken['tenant_id']?.toString() ??\n decodedToken['tenant']?.toString(),\n companyId:\n decodedToken['companyId']?.toString() ??\n decodedToken['company_id']?.toString() ??\n decodedToken['organizationId']?.toString() ??\n decodedToken['org_id']?.toString(),\n locale: decodedToken['locale']?.toString(),\n timezone: decodedToken['timezone']?.toString() ?? decodedToken['tz']?.toString(),\n };\n\n return userData;\n } catch {\n return null;\n }\n }\n\n /**\n * Extract array field from decoded token, trying multiple possible field names\n */\n private extractArrayField(\n decodedToken: Record<string, unknown>,\n fieldNames: string[],\n ): string[] | undefined {\n for (const fieldName of fieldNames) {\n const value = decodedToken[fieldName];\n if (Array.isArray(value)) {\n return value.map((v) => v.toString());\n }\n if (typeof value === 'string') {\n // Handle comma-separated string values\n return value\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n }\n }\n return undefined;\n }\n}\n","import { Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\n\n/**\n * Service to manage URL redirection after authentication\n * Stores the intended URL when session is lost and redirects to it after successful login\n * SSR-compatible by checking platform before accessing sessionStorage\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthUrlRedirect {\n private readonly REDIRECT_URL_KEY = 'acp_redirect_url';\n private readonly EXCLUDED_ROUTES = [\n '/login',\n '/auth',\n '/register',\n '/forgot-password',\n '/reset-password',\n ];\n\n private readonly router = inject(Router);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly document = inject(DOCUMENT);\n\n /**\n * Stores the current URL for later redirection\n * @param url - The URL to store (defaults to current URL)\n */\n storeIntendedUrl(url?: string): void {\n // Only store in browser environment\n if (!this.isBrowser()) {\n return;\n }\n\n const urlToStore = url || this.router.url;\n\n // Don't store authentication-related routes\n if (this.isExcludedRoute(urlToStore)) {\n return;\n }\n\n // Don't store URLs with query parameters that might contain sensitive data\n const urlWithoutParams = urlToStore.split('?')[0];\n this.getSessionStorage()?.setItem(this.REDIRECT_URL_KEY, urlWithoutParams);\n }\n\n /**\n * Gets the stored intended URL\n * @returns The stored URL or null if none exists\n */\n getIntendedUrl(): string | null {\n if (!this.isBrowser()) {\n return null;\n }\n return this.getSessionStorage()?.getItem(this.REDIRECT_URL_KEY) || null;\n }\n\n /**\n * Redirects to the stored URL and clears it from storage\n * @param defaultRoute - The default route to navigate to if no URL is stored\n */\n redirectToIntendedUrl(defaultRoute = '/'): void {\n const intendedUrl = this.getIntendedUrl();\n\n if (intendedUrl && !this.isExcludedRoute(intendedUrl)) {\n this.clearIntendedUrl();\n this.router.navigateByUrl(intendedUrl);\n } else {\n this.router.navigate([defaultRoute]);\n }\n }\n\n /**\n * Clears the stored intended URL\n */\n clearIntendedUrl(): void {\n if (!this.isBrowser()) {\n return;\n }\n this.getSessionStorage()?.removeItem(this.REDIRECT_URL_KEY);\n }\n\n /**\n * Checks if a URL should be excluded from redirection\n * @param url - The URL to check\n * @returns True if the URL should be excluded\n */\n private isExcludedRoute(url: string): boolean {\n return this.EXCLUDED_ROUTES.some((route) => url.includes(route));\n }\n\n /**\n * Stores the current URL if it's not an excluded route\n * Useful for guards and interceptors\n */\n storeCurrentUrlIfAllowed(): void {\n const currentUrl = this.router.url;\n if (!this.isExcludedRoute(currentUrl)) {\n this.storeIntendedUrl(currentUrl);\n }\n }\n\n /**\n * Checks if we're running in a browser environment\n * @returns True if running in browser, false if SSR\n */\n private isBrowser(): boolean {\n return isPlatformBrowser(this.platformId);\n }\n\n /**\n * Safely gets sessionStorage reference\n * @returns sessionStorage object or null if not available\n */\n private getSessionStorage(): Storage | null {\n if (!this.isBrowser()) {\n return null;\n }\n try {\n return this.document.defaultView?.sessionStorage || null;\n } catch {\n // Handle cases where sessionStorage might be disabled\n return null;\n }\n }\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { AuthTokenRepositoryImpl } from '../repositories/auth-token-repository-impl';\nimport { AuthUrlRedirect } from '../services/auth-url-redirect';\nimport { ENVIRONMENT } from '@acontplus/ng-config';\n\nexport const authGuard: CanActivateFn = (_route, state) => {\n const tokenRepository = inject(AuthTokenRepositoryImpl);\n const router = inject(Router);\n const urlRedirectService = inject(AuthUrlRedirect);\n const environment = inject(ENVIRONMENT);\n\n if (tokenRepository.isAuthenticated()) {\n return true;\n }\n\n // Store the current URL for redirection after login\n urlRedirectService.storeIntendedUrl(state.url);\n\n // Redirect to login page (configurable via environment)\n router.navigate([`/${environment.loginRoute}`]);\n return false;\n};\n","import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { catchError } from 'rxjs/operators';\nimport { throwError } from 'rxjs';\nimport { AuthUrlRedirect } from '../services/auth-url-redirect';\nimport { AuthTokenRepositoryImpl } from '../repositories/auth-token-repository-impl';\nimport { ENVIRONMENT } from '@acontplus/ng-config';\n\n/**\n * Interceptor that handles authentication errors and manages URL redirection\n * Captures the current URL when a 401 error occurs and redirects to login\n */\nexport const authRedirectInterceptor: HttpInterceptorFn = (req, next) => {\n const router = inject(Router);\n const urlRedirectService = inject(AuthUrlRedirect);\n const tokenRepository = inject(AuthTokenRepositoryImpl);\n const environment = inject(ENVIRONMENT);\n\n return next(req).pipe(\n catchError((error: HttpErrorResponse) => {\n // Handle 401 Unauthorized errors\n if (error.status === 401) {\n // Only store and redirect if user was previously authenticated\n // This prevents redirect loops and handles session expiry scenarios\n if (tokenRepository.isAuthenticated()) {\n // Store the current URL for redirection after re-authentication\n urlRedirectService.storeCurrentUrlIfAllowed();\n\n // Navigate to login page\n router.navigate([`/${environment.loginRoute}`]);\n }\n }\n\n // Re-throw the error so other error handlers can process it\n return throwError(() => error);\n }),\n );\n};\n","// src/lib/services/csrf-api.ts\nimport { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { firstValueFrom, map } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CsrfApi {\n private http = inject(HttpClient);\n private csrfToken: string | null = null;\n\n /**\n * Get CSRF token, fetching it if not available\n */\n async getCsrfToken(): Promise<string> {\n if (this.csrfToken) {\n return this.csrfToken;\n }\n\n try {\n this.csrfToken = await firstValueFrom(\n this.http\n .get<{ csrfToken: string }>('csrf-token')\n .pipe(map((response) => response.csrfToken)),\n );\n\n return this.csrfToken || '';\n } catch {\n // If CSRF endpoint fails, return empty token\n // Server should handle missing CSRF tokens appropriately\n return '';\n }\n }\n\n /**\n * Clear stored CSRF token (useful on logout)\n */\n clearCsrfToken(): void {\n this.csrfToken = null;\n }\n}\n","import { HttpInterceptorFn, HttpRequest, HttpContextToken } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { from } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { CsrfApi } from '../services/csrf-api';\n\n// A token to use with HttpContext for skipping CSRF token addition on specific requests.\nexport const SKIP_CSRF = new HttpContextToken<boolean>(() => false);\n\n/**\n * HTTP interceptor that automatically adds CSRF tokens to state-changing requests\n * Only applies to requests to the same origin to avoid leaking tokens to external APIs\n */\nexport const csrfInterceptor: HttpInterceptorFn = (req, next) => {\n const csrfService = inject(CsrfApi);\n\n // Check if CSRF should be skipped for this request\n const skipCsrf = req.context.get(SKIP_CSRF);\n if (skipCsrf) {\n return next(req);\n }\n\n // Only add CSRF token to state-changing requests (POST, PUT, PATCH, DELETE)\n const isStateChangingMethod = ['POST', 'PUT', 'PATCH', 'DELETE'].includes(\n req.method.toUpperCase(),\n );\n\n // Only add CSRF token to same-origin requests\n const isSameOrigin = isRequestToSameOrigin(req);\n\n if (isStateChangingMethod && isSameOrigin) {\n return from(csrfService.getCsrfToken()).pipe(\n switchMap((csrfToken) => {\n const modifiedReq = req.clone({\n setHeaders: {\n 'X-CSRF-Token': csrfToken,\n },\n });\n return next(modifiedReq);\n }),\n );\n }\n\n // For non-state-changing requests or external requests, proceed without modification\n return next(req);\n};\n\n/**\n * Checks if the request is going to the same origin as the current application\n */\nfunction isRequestToSameOrigin(req: HttpRequest<unknown>): boolean {\n try {\n const requestUrl = new URL(req.url, window.location.origin);\n return requestUrl.origin === window.location.origin;\n } catch {\n // If URL parsing fails, assume it's not same origin for security\n return false;\n }\n}\n","import { Provider } from '@angular/core';\nimport { AuthTokenRepositoryImpl } from '../repositories/auth-token-repository-impl';\nimport { AuthRepository } from '../domain/repositories/auth-repository';\nimport { AuthHttpRepository } from '../data/repositories/auth-http-repository';\nimport { AUTH_TOKEN } from '@acontplus/ng-config';\n\nexport const authProviders: Provider[] = [\n {\n provide: AuthRepository,\n useClass: AuthHttpRepository,\n },\n {\n provide: AUTH_TOKEN,\n useClass: AuthTokenRepositoryImpl,\n },\n];\n","// src/lib/providers/index.ts\nexport * from './auth-providers';\n","// src/lib/services/auth-state.ts\nimport { Injectable, inject, signal, OnDestroy, NgZone } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Observable, of, tap, catchError, throwError } from 'rxjs';\nimport { AuthRepository } from '../domain/repositories/auth-repository';\nimport { AuthTokenRepositoryImpl } from '../repositories/auth-token-repository-impl';\nimport { AuthUrlRedirect } from './auth-url-redirect';\nimport { AuthTokens, UserData, DecodedToken } from '@acontplus/core';\nimport { ENVIRONMENT } from '@acontplus/ng-config';\nimport {\n LoginRequest,\n RegisterRequest,\n ForgotPasswordRequest,\n ResetPasswordRequest,\n ChangePasswordRequest,\n VerifyEmailRequest,\n ResendVerificationRequest,\n MfaSetupResponse,\n VerifyMfaRequest,\n SocialLoginRequest,\n SocialProvider,\n SocialAuthUrl,\n DomainDiscoveryResponse,\n OAuthConfig,\n TenantConfig,\n} from '../domain/models/auth';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthState implements OnDestroy {\n private readonly authRepository = inject(AuthRepository);\n private readonly tokenRepository = inject(AuthTokenRepositoryImpl);\n private readonly router = inject(Router);\n private readonly ngZone = inject(NgZone);\n private readonly urlRedirectService = inject(AuthUrlRedirect);\n private readonly environment = inject(ENVIRONMENT);\n\n // Authentication state signals\n private readonly _isAuthenticated = signal<boolean>(false);\n private readonly _isLoading = signal<boolean>(false);\n private readonly _user = signal<UserData | null>(null);\n private readonly _mfaRequired = signal<boolean>(false);\n private readonly _emailVerified = signal<boolean>(true);\n\n // Public readonly signals\n readonly isAuthenticated = this._isAuthenticated.asReadonly();\n readonly isLoading = this._isLoading.asReadonly();\n readonly user = this._user.asReadonly();\n readonly mfaRequired = this._mfaRequired.asReadonly();\n readonly emailVerified = this._emailVerified.asReadonly();\n\n // Private refresh token timeout\n private refreshTokenTimeout?: number;\n private refreshInProgress$?: Observable<AuthTokens | null>;\n\n constructor() {\n this.initializeAuthentication();\n }\n\n // ============================================\n // Core Authentication\n // ============================================\n\n /**\n * Login with email and password\n */\n login(request: LoginRequest): Observable<AuthTokens> {\n this._isLoading.set(true);\n\n return this.authRepository.login(request).pipe(\n tap((tokens) => {\n this.setAuthenticated(tokens, request.rememberMe ?? false);\n this.urlRedirectService.redirectToIntendedUrl('/');\n }),\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Register a new user\n */\n register(request: RegisterRequest): Observable<AuthTokens> {\n this._isLoading.set(true);\n\n return this.authRepository.register(request).pipe(\n tap((tokens) => {\n this.setAuthenticated(tokens);\n this._emailVerified.set(false); // New users need email verification\n this.router.navigate(['/']);\n }),\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Logout user and clear all authentication data\n */\n logout(): Observable<void> {\n const userData = this.tokenRepository.getUserData();\n const refreshToken = this.tokenRepository.getRefreshToken();\n\n if (userData?.email && refreshToken && refreshToken.length > 0) {\n return this.authRepository.logout(userData.email, refreshToken).pipe(\n tap(() => this.performClientLogout()),\n catchError(() => {\n this.performClientLogout();\n return of(void 0);\n }),\n );\n }\n\n this.performClientLogout();\n return of(void 0);\n }\n\n /**\n * Refresh authentication tokens\n */\n refreshToken(): Observable<AuthTokens | null> {\n if (this.refreshInProgress$) {\n return this.refreshInProgress$;\n }\n\n const userData = this.tokenRepository.getUserData();\n const refreshToken = this.tokenRepository.getRefreshToken();\n\n if (!userData?.email || !refreshToken) {\n this.performClientLogout();\n return of(null);\n }\n\n this.refreshInProgress$ = this.authRepository\n .refreshToken({ email: userData.email, refreshToken })\n .pipe(\n tap((tokens) => {\n const rememberMe = this.tokenRepository.isRememberMeEnabled();\n this.setAuthenticated(tokens, rememberMe);\n }),\n catchError(() => {\n this.performClientLogout();\n return of(null);\n }),\n tap({\n complete: () => (this.refreshInProgress$ = undefined),\n error: () => (this.refreshInProgress$ = undefined),\n }),\n );\n\n return this.refreshInProgress$;\n }\n\n // ============================================\n // Password Management\n // ============================================\n\n /**\n * Request password reset email\n */\n forgotPassword(request: ForgotPasswordRequest): Observable<void> {\n this._isLoading.set(true);\n\n return this.authRepository.forgotPassword(request).pipe(\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Reset password with token\n */\n resetPassword(request: ResetPasswordRequest): Observable<void> {\n this._isLoading.set(true);\n\n return this.authRepository.resetPassword(request).pipe(\n tap(() => this.router.navigate([`/${this.environment.loginRoute}`])),\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Change password for authenticated user\n */\n changePassword(request: ChangePasswordRequest): Observable<void> {\n this._isLoading.set(true);\n\n return this.authRepository.changePassword(request).pipe(\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n // ============================================\n // Email Verification\n // ============================================\n\n /**\n * Verify email with token\n */\n verifyEmail(request: VerifyEmailRequest): Observable<void> {\n this._isLoading.set(true);\n\n return this.authRepository.verifyEmail(request).pipe(\n tap(() => this._emailVerified.set(true)),\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Resend verification email\n */\n resendVerificationEmail(request: ResendVerificationRequest): Observable<void> {\n this._isLoading.set(true);\n\n return this.authRepository.resendVerificationEmail(request).pipe(\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n // ============================================\n // MFA/2FA\n // ============================================\n\n /**\n * Setup MFA for authenticated user\n */\n setupMfa(): Observable<MfaSetupResponse> {\n this._isLoading.set(true);\n\n return this.authRepository.setupMfa().pipe(\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Verify MFA code and complete login\n */\n verifyMfa(request: VerifyMfaRequest): Observable<AuthTokens> {\n this._isLoading.set(true);\n\n return this.authRepository.verifyMfa(request).pipe(\n tap((tokens) => {\n this.setAuthenticated(tokens);\n this._mfaRequired.set(false);\n this.urlRedirectService.redirectToIntendedUrl('/');\n }),\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Disable MFA for authenticated user\n */\n disableMfa(code: string): Observable<void> {\n this._isLoading.set(true);\n\n return this.authRepository.disableMfa(code).pipe(\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n // ============================================\n // Social Login\n // ============================================\n\n /**\n * Get social authentication URL\n * @param provider - Social provider (google, microsoft, etc.)\n * @param config - Optional OAuth configuration with tenant/domain information\n */\n getSocialAuthUrl(\n provider: SocialProvider,\n config?: Partial<OAuthConfig>,\n ): Observable<SocialAuthUrl> {\n return this.authRepository.getSocialAuthUrl(provider, config);\n }\n\n /**\n * Complete social login with provider tokens\n */\n socialLogin(request: SocialLoginRequest): Observable<AuthTokens> {\n this._isLoading.set(true);\n\n return this.authRepository.socialLogin(request).pipe(\n tap((tokens) => {\n this.setAuthenticated(tokens, true);\n this.urlRedirectService.redirectToIntendedUrl('/');\n }),\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n // ============================================\n // Multi-Tenant / Domain Discovery\n // ============================================\n\n /**\n * Discover authentication method and tenant information based on email domain\n * This is useful for multi-tenant scenarios where different domains use different identity providers\n *\n * Example: User enters \"user@acme.com\" -> discovers it should use Google Workspace OAuth\n *\n * @param email - User's email address\n * @returns Discovery response with provider, tenant info, and authentication options\n */\n discoverDomain(email: string): Observable<DomainDiscoveryResponse> {\n this._isLoading.set(true);\n\n return this.authRepository.discoverDomain({ email }).pipe(\n tap({ finalize: () => this._isLoading.set(false) }),\n catchError((error) => {\n this._isLoading.set(false);\n return throwError(() => error);\n }),\n );\n }\n\n /**\n * Get tenant configuration for OAuth setup\n *\n * @param tenantId - Unique tenant identifier\n * @returns Tenant configuration including OAuth client ID, issuer, allowed domains, etc.\n */\n getTenantConfig(tenantId: string): Observable<TenantConfig> {\n return this.authRepository.getTenantConfig(tenantId);\n }\n\n /**\n * List all configured tenants (useful for selecting tenant in login UI)\n *\n * @returns Array of available tenant configurations\n */\n listTenants(): Observable<TenantConfig[]> {\n return this.authRepository.listTenants();\n }\n\n /**\n * Start OAuth flow for multi-tenant authentication\n * This method redirects the user to the provider's OAuth consent screen\n *\n * Example usage for Google Workspace:\n * ```typescript\n * authState.discoverDomain('user@acme.com').subscribe(discovery => {\n * if (discovery.requiresOAuth) {\n * authState.startOAuthFlow({\n * provider: discovery.provider!,\n * tenantId: discovery.tenantId,\n * domain: discovery.domain\n * });\n * }\n * });\n * ```\n *\n * @param config - OAuth configuration with provider, tenant, and domain information\n */\n startOAuthFlow(config: {\n provider: SocialProvider;\n tenantId?: string;\n domain?: string;\n redirectUri?: string;\n }): void {\n this._isLoading.set(true);\n\n this.getSocialAuthUrl(config.provider, config).subscribe({\n next: (authUrl) => {\n // Store OAuth state for callback verification\n if (authUrl.state) {\n sessionStorage.setItem('oauth_state', authUrl.state);\n }\n if (config.tenantId) {\n sessionStorage.setItem('oauth_tenant_id', config.tenantId);\n }\n if (config.domain) {\n sessionStorage.setItem('oauth_domain', config.domain);\n }\n\n // Redirect to provider OAuth consent screen\n window.location.href = authUrl.url;\n },\n error: (error) => {\n this._isLoading.set(false);\n console.error('Failed to get OAuth URL:', error);\n },\n });\n }\n\n /**\n * Handle OAuth callback after user returns from provider\n * Call this method in your OAuth callback component/route\n *\n * Example:\n * ```typescript\n * // In your callback component\n * ngOnInit() {\n * const params = new URLSearchParams(window.location.search);\n * const code = params.get('code');\n * const state = params.get('state');\n * const provider = 'google'; // or get from route params\n *\n * if (code && state) {\n * this.authState.handleOAuthCallback(provider, code, state).subscribe();\n * }\n * }\n * ```\n *\n * @param provider - Social provider that initiated the OAuth flow\n * @param code - Authorization code from OAuth callback\n * @param state - State parameter for CSRF protection\n * @returns Observable with authentication tokens\n */\n handleOAuthCallback(\n provider: SocialProvider,\n code: string,\n state: string,\n ): Observable<AuthTokens> {\n this._isLoading.set(true);\n\n // Verify state to prevent CSRF attacks\n const storedState = sessionStorage.getItem('oauth_state');\n if (storedState !== state) {\n this._isLoading.set(false);\n return throwError(() => new Error('Invalid OAuth state - possible CSRF attack'));\n }\n\n // Get stored OAuth context\n const tenantId = sessionStorage.getItem('oauth_tenant_id') || undefined;\n const domain = sessionStorage.getItem('oauth_domain') || undefined;\n\n // Clear stored OAuth data\n sessionStorage.removeItem('oauth_state');\n sessionStorage.removeItem('oauth_tenant_id');\n sessionStorage.removeItem('oauth_domain');\n\n // Complete social login\n return this.socialLogin({\n provider,\n code,\n state,\n tenantId,\n domain,\n });\n }\n\n // ============================================\n // State Management\n // ============================================\n\n /**\n * Set authentication state after successful login\n */\n setAuthenticated(tokens: AuthTokens, rememberMe = false): void {\n this.tokenRepository.saveTokens(tokens, rememberMe);\n this._isAuthenticated.set(true);\n const userData = this.tokenRepository.getUserData();\n this._user.set(userData);\n this.scheduleTokenRefresh();\n }\n\n /**\n * Check if user is authenticated\n */\n checkAuthentication(): boolean {\n const isAuthenticated = this.tokenRepository.isAuthenticated();\n this._isAuthenticated.set(isAuthenticated);\n\n if (!isAuthenticated) {\n this.performClientLogout();\n }\n\n return isAuthenticated;\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private initializeAuthentication(): void {\n this._isLoading.set(true);\n\n try {\n const isAuthenticated = this.tokenRepository.isAuthenticated();\n this._isAuthenticated.set(isAuthenticated);\n\n if (isAuthenticated) {\n const userData = this.tokenRepository.getUserData();\n this._user.set(userData);\n this.scheduleTokenRefresh();\n }\n } catch {\n this.performClientLogout();\n } finally {\n this._isLoading.set(false);\n }\n }\n\n private scheduleTokenRefresh(): void {\n const accessToken = this.tokenRepository.getToken();\n if (!accessToken) {\n return;\n }\n\n try {\n const decodedToken = this.decodeToken(accessToken);\n const currentTime = Math.floor(Date.now() / 1000);\n const timeUntilExpiry = decodedToken.exp - currentTime;\n const refreshTime = Math.max((timeUntilExpiry - 300) * 1000, 1000);\n\n if (this.refreshTokenTimeout) {\n clearTimeout(this.refreshTokenTimeout);\n }\n\n this.ngZone.runOutsideAngular(() => {\n this.refreshTokenTimeout = window.setTimeout(() => {\n this.ngZone.run(() => {\n if (this.tokenRepository.needsRefresh()) {\n this.refreshToken().subscribe();\n }\n });\n }, refreshTime);\n });\n } catch {\n // Silent fail - token might be invalid\n }\n }\n\n private stopTokenRefreshTimer(): void {\n if (this.refreshTokenTimeout) {\n clearTimeout(this.refreshTokenTimeout);\n this.refreshTokenTimeout = undefined;\n }\n }\n\n private performClientLogout(): void {\n this.stopTokenRefreshTimer();\n this.tokenRepository.clearTokens();\n this._isAuthenticated.set(false);\n this._user.set(null);\n this._mfaRequired.set(false);\n this.router.navigate([`/${this.environment.loginRoute}`]);\n }\n\n private decodeToken(token: string): DecodedToken {\n try {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split('')\n .map((c) => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`)\n .join(''),\n );\n return JSON.parse(jsonPayload);\n } catch {\n throw new Error('Invalid token format');\n }\n }\n\n ngOnDestroy(): void {\n this.stopTokenRefreshTimer();\n }\n}\n","// src/lib/presentation/components/login/login.ts\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n signal,\n computed,\n OnInit,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n FormGroup,\n FormBuilder,\n Validators,\n ReactiveFormsModule,\n AbstractControl,\n} from '@angular/forms';\nimport {\n MatCard,\n MatCardContent,\n MatCardFooter,\n MatCardHeader,\n MatCardTitle,\n} from '@angular/material/card';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatInput } from '@angular/material/input';\nimport { MatIcon, MatIconRegistry } from '@angular/material/icon';\nimport { MatAnchor, MatButton } from '@angular/material/button';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { MatDivider } from '@angular/material/divider';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { AuthState } from '../../services/auth-state';\nimport { LoggingService } from '@acontplus/ng-infrastructure';\nimport { DomainDiscoveryResponse, SocialProvider } from '../../domain/models/auth';\nimport { DEFAULT_ICONS } from '@acontplus/ui-kit';\n\n@Component({\n selector: 'acp-login',\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatCard,\n MatCardHeader,\n MatLabel,\n MatCardTitle,\n MatCardContent,\n MatFormField,\n MatInput,\n MatIcon,\n MatButton,\n MatCardFooter,\n MatAnchor,\n MatCheckbox,\n MatDivider,\n ],\n templateUrl: './login.html',\n styleUrls: ['./login.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class Login implements OnInit {\n title = input<string>('Login');\n showRegisterButton = input<boolean>(true);\n showRememberMe = input<boolean>(true);\n enableDomainDiscovery = input<boolean>(false); // Enable multi-tenant domain discovery\n showSocialLogin = input<boolean>(true); // Show social login buttons\n\n // Additional form controls that can be passed from parent components\n additionalSigninControls = input<Record<string, AbstractControl>>({});\n additionalSignupControls = input<Record<string, AbstractControl>>({});\n\n // Additional field templates\n additionalSigninFields = input<TemplateRef<unknown> | null>(null);\n additionalSignupFields = input<TemplateRef<unknown> | null>(null);\n\n // Footer content template\n footerContent = input<TemplateRef<unknown> | null>(null);\n\n // Computed signal to check if footer content exists\n hasFooterContent = computed(() => this.footerContent() !== null);\n\n private readonly fb = inject(FormBuilder);\n private readonly authState = inject(AuthState);\n private readonly loggingService = inject(LoggingService);\n private readonly iconRegistry = inject(MatIconRegistry);\n private readonly sanitizer = inject(DomSanitizer);\n\n // Angular 20+ signals\n isLoginMode = signal(true);\n isLoading = signal(false);\n errorMessage = signal<string | null>(null);\n discoveryResult = signal<DomainDiscoveryResponse | null>(null);\n showPasswordLogin = signal(true);\n\n signinForm: FormGroup;\n signupForm: FormGroup;\n\n constructor() {\n // Register social login icons\n this.registerSocialIcons();\n\n this.signinForm = this.fb.group({\n email: ['', [Validators.required, Validators.email]],\n password: ['', Validators.required],\n rememberMe: [false], // Default to false (unchecked)\n });\n\n this.signupForm = this.fb.group({\n displayName: ['', Validators.required],\n email: ['', [Validators.required, Validators.email]],\n password: ['', [Validators.required, Validators.minLength(6)]],\n });\n }\n\n private registerSocialIcons(): void {\n const socialIconNames = ['google', 'microsoft', 'github', 'facebook', 'apple', 'linkedin'];\n socialIconNames.forEach((name) => {\n const icon = DEFAULT_ICONS.find((i) => i.name === name);\n if (icon?.data) {\n this.iconRegistry.addSvgIconLiteral(\n name,\n this.sanitizer.bypassSecurityTrustHtml(icon.data),\n );\n } else {\n console.warn(`Icon '${name}' not found in DEFAULT_ICONS`);\n }\n });\n }\n\n ngOnInit(): void {\n // Handle rememberMe control based on showRememberMe input\n if (!this.showRememberMe()) {\n // Remove rememberMe control if not needed\n this.signinForm.removeControl('rememberMe');\n }\n\n // Add additional controls to signin form\n Object.entries(this.additionalSigninControls()).forEach(([key, control]) => {\n this.signinForm.addControl(key, control);\n });\n\n // Add additional controls to signup form\n Object.entries(this.additionalSignupControls()).forEach(([key, control]) => {\n this.signupForm.addControl(key, control);\n });\n\n // Set up domain discovery on email change if enabled\n if (this.enableDomainDiscovery()) {\n this.signinForm.get('email')?.valueChanges.subscribe((email: string) => {\n if (email && this.isValidEmail(email)) {\n this.checkDomain(email);\n }\n });\n }\n }\n\n private isValidEmail(email: string): boolean {\n const emailPattern = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailPattern.test(email);\n }\n\n private checkDomain(email: string): void {\n this.authState.discoverDomain(email).subscribe({\n next: (result) => {\n this.discoveryResult.set(result);\n this.showPasswordLogin.set(result.allowPasswordLogin);\n\n // If domain requires OAuth and doesn't allow password login, hide password field\n if (result.requiresOAuth && !result.allowPasswordLogin) {\n this.signinForm.get('password')?.disable();\n } else {\n this.signinForm.get('password')?.enable();\n }\n },\n error: (err) => {\n // Silently handle discovery errors - fallback to standard login\n this.loggingService.warn('Domain discovery failed', { error: err });\n this.discoveryResult.set(null);\n this.showPasswordLogin.set(true);\n },\n });\n }\n\n switchMode(): void {\n this.isLoginMode.set(!this.isLoginMode());\n this.errorMessage.set(null);\n }\n\n signIn(): void {\n if (this.signinForm.valid) {\n this.isLoading.set(true);\n this.errorMessage.set(null);\n\n // Prepare login request with rememberMe handling\n const loginRequest = {\n ...this.signinForm.value,\n // If showRememberMe is false, default rememberMe to false\n rememberMe: this.showRememberMe() ? (this.signinForm.value.rememberMe ?? false) : false,\n };\n\n this.authState.login(loginRequest).subscribe({\n next: () => {\n this.isLoading.set(false);\n },\n error: (error) => {\n this.isLoading.set(false);\n this.errorMessage.set('Error al iniciar sesión. Verifique sus credenciales.');\n this.loggingService.error('Login failed', { error });\n },\n });\n }\n }\n\n registerUser(): void {\n if (this.signupForm.valid) {\n this.isLoading.set(true);\n this.errorMessage.set(null);\n\n this.authState.register(this.signupForm.value).subscribe({\n next: () => {\n this.isLoading.set(false);\n this.signupForm.reset();\n this.isLoginMode.set(true);\n },\n error: (error) => {\n this.isLoading.set(false);\n this.errorMessage.set('Error al registrar usuario. Intente nuevamente.');\n this.loggingService.error('Register error', { error });\n },\n });\n }\n }\n\n /**\n * Start OAuth flow for discovered provider or specified provider\n */\n loginWithProvider(provider?: SocialProvider): void {\n const discovery = this.discoveryResult();\n const finalProvider = provider || discovery?.provider;\n\n if (!finalProvider) {\n this.errorMessage.set('No authentication provider configured');\n return;\n }\n\n this.isLoading.set(true);\n this.errorMessage.set(null);\n\n this.authState.startOAuthFlow({\n provider: finalProvider,\n tenantId: discovery?.tenantId,\n domain: discovery?.domain,\n });\n }\n\n /**\n * Handle direct social login button clicks\n */\n socialLogin(provider: SocialProvider): void {\n this.loginWithProvider(provider);\n }\n}\n","<mat-card class=\"mat-elevation-z8 p-4 rounded\">\n <mat-card-header>\n <mat-card-title class=\"text-center\">{{ title() }}</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n @if (isLoginMode()) {\n <form [formGroup]=\"signinForm\" (ngSubmit)=\"signIn()\" class=\"d-flex flex-column gap-3\">\n <mat-form-field class=\"w-100\">\n <mat-label>Usuario</mat-label>\n <input matInput type=\"text\" placeholder=\"Ingrese su usuario\" formControlName=\"email\" />\n </mat-form-field>\n\n <!-- Show discovery message if OAuth is required -->\n @if (enableDomainDiscovery() && discoveryResult() && discoveryResult()!.requiresOAuth) {\n <div class=\"discovery-message\">\n @if (discoveryResult()!.provider) {\n <p>\n <mat-icon>info</mat-icon>\n Su organización utiliza {{ discoveryResult()!.provider }} para la autenticación\n </p>\n @if (!discoveryResult()!.allowPasswordLogin) {\n <p class=\"warning\">Por favor, use el botón de inicio de sesión corporativo</p>\n }\n }\n </div>\n }\n\n <!-- Password field - only show if allowed -->\n @if (showPasswordLogin()) {\n <mat-form-field class=\"w-100\">\n <mat-label>Contraseña</mat-label>\n <input\n matInput\n type=\"password\"\n placeholder=\"Ingrese su contraseña\"\n formControlName=\"password\"\n autocomplete=\"current-password\"\n />\n </mat-form-field>\n\n <!-- Remember Me checkbox - conditional -->\n @if (showRememberMe()) {\n <div class=\"d-flex align-items-center mt-2\">\n <mat-checkbox formControlName=\"rememberMe\"> Recordarme </mat-checkbox>\n </div>\n }\n\n <!-- Additional signin fields -->\n <ng-container *ngTemplateOutlet=\"additionalSigninFields()\"></ng-container>\n\n <div class=\"d-flex justify-content-center mt-3\">\n <button\n mat-raised-button\n color=\"primary\"\n [disabled]=\"!signinForm.valid || isLoading()\"\n type=\"submit\"\n class=\"w-100\"\n >\n @if (isLoading()) {\n Ingresando...\n } @else {\n <ng-container>Ingresar <mat-icon>login</mat-icon></ng-container>\n }\n </button>\n </div>\n }\n\n <!-- OAuth/SSO Login Buttons -->\n @if (\n enableDomainDiscovery() &&\n discoveryResult() &&\n discoveryResult()!.requiresOAuth &&\n discoveryResult()!.provider\n ) {\n <div class=\"d-flex justify-content-center mt-3\">\n <button\n mat-raised-button\n color=\"accent\"\n type=\"button\"\n (click)=\"loginWithProvider()\"\n class=\"w-100 oauth-button\"\n [disabled]=\"isLoading()\"\n >\n <mat-icon>business</mat-icon>\n Iniciar sesión con {{ discoveryResult()!.provider }}\n </button>\n </div>\n }\n\n <!-- Social Login Divider -->\n @if (showSocialLogin() && showPasswordLogin()) {\n <mat-divider class=\"my-3\"></mat-divider>\n <p class=\"text-center text-muted\">O continuar con</p>\n }\n\n <!-- Social Login Buttons -->\n @if (showSocialLogin() && !discoveryResult()?.requiresOAuth) {\n <div class=\"social-login-buttons\">\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"socialLogin('google')\"\n class=\"w-100 social-button\"\n [disabled]=\"isLoading()\"\n >\n <mat-icon svgIcon=\"google\"></mat-icon>\n Google\n </button>\n\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"socialLogin('microsoft')\"\n class=\"w-100 social-button\"\n [disabled]=\"isLoading()\"\n >\n <mat-icon svgIcon=\"microsoft\"></mat-icon>\n Microsoft\n </button>\n\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"socialLogin('github')\"\n class=\"w-100 social-button\"\n [disabled]=\"isLoading()\"\n >\n <mat-icon svgIcon=\"github\"></mat-icon>\n GitHub\n </button>\n </div>\n }\n\n <div class=\"text-center mt-2\">\n @if (showRegisterButton()) {\n <button mat-button type=\"button\" (click)=\"switchMode()\">\n ¿No tienes cuenta? Regístrate\n </button>\n }\n </div>\n </form>\n } @else {\n <form [formGroup]=\"signupForm\" (ngSubmit)=\"registerUser()\" class=\"d-flex flex-column gap-3\">\n <mat-form-field class=\"w-100\">\n <mat-label>Nombre</mat-label>\n <input\n matInput\n type=\"text\"\n placeholder=\"Ingrese su nombre\"\n formControlName=\"displayName\"\n />\n </mat-form-field>\n\n <mat-form-field class=\"w-100\">\n <mat-label>Email</mat-label>\n <input matInput type=\"email\" placeholder=\"Ingrese su email\" formControlName=\"email\" />\n </mat-form-field>\n\n <mat-form-field class=\"w-100\">\n <mat-label>Contraseña</mat-label>\n <input\n matInput\n type=\"password\"\n placeholder=\"Ingrese su contraseña\"\n formControlName=\"password\"\n autocomplete=\"new-password\"\n />\n </mat-form-field>\n\n <!-- Additional signup fields -->\n <ng-container *ngTemplateOutlet=\"additionalSignupFields()\"></ng-container>\n\n <div class=\"d-flex justify-content-center mt-3\">\n <button\n mat-raised-button\n color=\"primary\"\n [disabled]=\"!signupForm.valid || isLoading()\"\n type=\"submit\"\n class=\"w-100\"\n >\n @if (isLoading()) {\n Registrando...\n } @else {\n <ng-container>Registrarse <mat-icon>person_add</mat-icon></ng-container>\n }\n </button>\n </div>\n\n <div class=\"text-center mt-2\">\n <button mat-button type=\"button\" (click)=\"switchMode()\">\n ¿Ya tienes cuenta? Inicia sesión\n </button>\n </div>\n </form>\n }\n @if (errorMessage()) {\n <div class=\"alert alert-danger mt-3\" role=\"alert\">{{ errorMessage() }}</div>\n }\n </mat-card-content>\n @if (hasFooterContent()) {\n <mat-card-footer>\n <ng-container *ngTemplateOutlet=\"footerContent()\"></ng-container>\n </mat-card-footer>\n }\n</mat-card>\n","// src/lib/presentation/components/index.ts\nexport { Login } from './login';\n","// src/lib/ui/oauth-callback/oauth-callback.ts\nimport { Component, OnInit, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { AuthState } from '../../services/auth-state';\nimport { SocialProvider } from '../../domain/models/auth';\n\n/**\n * OAuth Callback Component\n *\n * This component handles the OAuth callback after user authenticates with external provider.\n * It extracts the authorization code and state from URL parameters, verifies them,\n * and completes the authentication flow.\n *\n * Usage:\n * 1. Register this component in your routes:\n * ```typescript\n * {\n * path: 'auth/callback/:provider',\n * component: OAuthCallbackComponent\n * }\n * ```\n *\n * 2. Configure OAuth redirect URI in your backend:\n * ```\n * https://your-app.com/auth/callback/google\n * https://your-app.com/auth/callback/microsoft\n * ```\n *\n * The component will:\n * - Extract provider from route params\n * - Extract code and state from query params\n * - Validate state for CSRF protection\n * - Complete OAuth login flow\n * - Redirect to intended URL or home page\n * - Show error message if authentication fails\n */\n@Component({\n selector: 'acp-oauth-callback',\n standalone: true,\n imports: [MatProgressSpinnerModule],\n template: `\n <div class=\"oauth-callback-container\">\n @if (loading) {\n <mat-spinner diameter=\"48\"></mat-spinner>\n <p>Completing authentication...</p>\n }\n\n @if (error) {\n <div class=\"error-message\">\n <h2>Authentication Failed</h2>\n <p>{{ error }}</p>\n <button (click)=\"goToLogin()\">Return to Login</button>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .oauth-callback-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n padding: 2rem;\n text-align: center;\n }\n\n mat-spinner {\n margin-bottom: 1.5rem;\n }\n\n p {\n font-size: 1rem;\n color: #666;\n margin: 0;\n }\n\n .error-message {\n max-width: 400px;\n }\n\n .error-message h2 {\n color: #d32f2f;\n margin-bottom: 1rem;\n }\n\n .error-message p {\n color: #666;\n margin-bottom: 2rem;\n }\n\n .error-message button {\n padding: 0.75rem 2rem;\n background-color: #1976d2;\n color: white;\n border: none;\n border-radius: 4px;\n font-size: 1rem;\n cursor: pointer;\n transition: background-color 0.2s;\n }\n\n .error-message button:hover {\n background-color: #1565c0;\n }\n `,\n ],\n})\nexport class OAuthCallbackComponent implements OnInit {\n private readonly authState = inject(AuthState);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n loading = true;\n error: string | null = null;\n\n ngOnInit(): void {\n this.handleCallback();\n }\n\n private handleCallback(): void {\n // Get provider from route params\n const provider = this.route.snapshot.paramMap.get('provider') as SocialProvider;\n\n // Get OAuth callback params from query string\n const code = this.route.snapshot.queryParamMap.get('code');\n const state = this.route.snapshot.queryParamMap.get('state');\n const error = this.route.snapshot.queryParamMap.get('error');\n const errorDescription = this.route.snapshot.queryParamMap.get('error_description');\n\n // Check for OAuth errors\n if (error) {\n this.loading = false;\n this.error = errorDescription || `OAuth error: ${error}`;\n console.error('OAuth error:', { error, errorDescription });\n return;\n }\n\n // Validate required parameters\n if (!provider) {\n this.loading = false;\n this.error = 'Missing provider in callback URL';\n console.error('OAuth callback error: Missing provider');\n return;\n }\n\n if (!code || !state) {\n this.loading = false;\n this.error = 'Missing authorization code or state parameter';\n console.error('OAuth callback error: Missing code or state');\n return;\n }\n\n // Complete OAuth flow\n this.authState.handleOAuthCallback(provider, code, state).subscribe({\n next: () => {\n this.loading = false;\n // AuthState will handle redirect via urlRedirectService\n },\n error: (err) => {\n this.loading = false;\n this.error = err.error?.message || err.message || 'Authentication failed';\n console.error('OAuth callback error:', err);\n },\n });\n }\n\n goToLogin(): void {\n this.router.navigate(['/auth/login']);\n }\n}\n","// src/lib/ui/oauth-callback/index.ts\nexport * from './oauth-callback';\n","// src/lib/ui/index.ts\nexport * from './login';\nexport * from './oauth-callback';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["catchError","i1"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@acontplus/ng-auth",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.3",
|
|
4
4
|
"description": "Comprehensive Angular authentication module with JWT token management, route guards, CSRF protection, URL redirection, session handling, and clean architecture patterns. Includes login components, auth interceptors, and DDD-based repositories.",
|
|
5
5
|
"peerDependencies": {
|
|
6
|
-
"@acontplus/core": "^1.1.
|
|
7
|
-
"@acontplus/ng-infrastructure": "^2.0.
|
|
8
|
-
"@acontplus/ng-config": "^2.0.
|
|
6
|
+
"@acontplus/core": "^1.1.2",
|
|
7
|
+
"@acontplus/ng-infrastructure": "^2.0.4",
|
|
8
|
+
"@acontplus/ng-config": "^2.0.1",
|
|
9
9
|
"@acontplus/ui-kit": "^1.0.2",
|
|
10
|
-
"@angular/common": "^21.0.
|
|
11
|
-
"@angular/core": "^21.0.
|
|
12
|
-
"@angular/router": "^21.0.
|
|
13
|
-
"@angular/forms": "^21.0.
|
|
14
|
-
"@angular/platform-browser": "^21.0.
|
|
15
|
-
"@angular/material": "^21.0.
|
|
10
|
+
"@angular/common": "^21.0.0",
|
|
11
|
+
"@angular/core": "^21.0.0",
|
|
12
|
+
"@angular/router": "^21.0.0",
|
|
13
|
+
"@angular/forms": "^21.0.0",
|
|
14
|
+
"@angular/platform-browser": "^21.0.0",
|
|
15
|
+
"@angular/material": "^21.0.0",
|
|
16
16
|
"jwt-decode": "^4.0.0",
|
|
17
17
|
"rxjs": "^7.8.1"
|
|
18
18
|
},
|