From 07cbaeaa0855a79c54328099a9a43e60b9267e32 Mon Sep 17 00:00:00 2001 From: Fahri Gedik Date: Fri, 25 Jul 2025 14:29:11 +0300 Subject: [PATCH] Add app initializer to handle OAuth code flow Introduces an app initializer that checks for an OAuth authorization code in the URL. If present, it waits for authentication to complete, and if not authenticated within 3 seconds, redirects to the login page. This improves handling of OAuth login flows. --- .../providers/oauth-module-config.provider.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/npm/ng-packs/packages/oauth/src/lib/providers/oauth-module-config.provider.ts b/npm/ng-packs/packages/oauth/src/lib/providers/oauth-module-config.provider.ts index 92ecc86012..f3b475a434 100644 --- a/npm/ng-packs/packages/oauth/src/lib/providers/oauth-module-config.provider.ts +++ b/npm/ng-packs/packages/oauth/src/lib/providers/oauth-module-config.provider.ts @@ -9,12 +9,14 @@ import { AuthErrorFilterService, } from '@abp/ng.core'; import { Provider, makeEnvironmentProviders, inject, provideAppInitializer } from '@angular/core'; +import { interval, filter, take, map, firstValueFrom, timeout, catchError, of } from 'rxjs'; import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { OAuthModule, OAuthStorage } from 'angular-oauth2-oidc'; import { AbpOAuthGuard, abpOAuthGuard } from '../guards'; import { OAuthConfigurationHandler } from '../handlers'; import { OAuthApiInterceptor } from '../interceptors'; import { AbpOAuthService, OAuthErrorFilterService } from '../services'; + import { pipeToLogin, checkAccessToken } from '../utils'; import { NavigateToManageProfileProvider } from './navigate-to-manage-profile.provider'; @@ -53,6 +55,25 @@ export function provideAbpOAuth() { provideAppInitializer(() => { inject(OAuthConfigurationHandler); }), + provideAppInitializer(async () => { + const authService = inject(AuthService); + const code = new URLSearchParams(window.location.search).get('code'); + if (code) { + return firstValueFrom( + interval(100).pipe( + map(() => authService.isAuthenticated), + filter(isAuthenticated => isAuthenticated), + take(1), + timeout(3000), + catchError(() => { + authService.navigateToLogin(); + return of(null); + }) + ) + ); + } + return Promise.resolve(); + }), OAuthModule.forRoot().providers as Provider[], { provide: OAuthStorage, useClass: AbpLocalStorageService }, { provide: AuthErrorFilterService, useExisting: OAuthErrorFilterService },