Browse Source

Add async auth guard support for OAuth routes

Introduced asyncAuthGuard and asyncAbpOAuthGuard to enable asynchronous authentication checks, particularly for OAuth flows involving code exchange. Updated app routes and OAuth module provider to use the new async guards where appropriate.
pull/23389/head
Fahri Gedik 7 months ago
parent
commit
a080ebc69e
  1. 6
      npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts
  2. 32
      npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts
  3. 7
      npm/ng-packs/packages/oauth/src/lib/providers/oauth-module-config.provider.ts

6
npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts

@ -21,3 +21,9 @@ export const authGuard: CanActivateFn = () => {
console.error('You should add @abp/ng-oauth packages or create your own auth packages.');
return false;
};
export const asyncAuthGuard: CanActivateFn = () => {
console.error('You should add @abp/ng-oauth packages or create your own auth packages.');
return false;
};

32
npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts

@ -6,7 +6,7 @@ import {
CanActivateFn,
} from '@angular/router';
import { Observable } from 'rxjs';
import { Observable, interval, filter, take, map, firstValueFrom, timeout, catchError, of } from 'rxjs';
import { OAuthService } from 'angular-oauth2-oidc';
import { AuthService, IAbpGuard } from '@abp/ng.core';
@ -53,3 +53,33 @@ export const abpOAuthGuard: CanActivateFn = (
authService.navigateToLogin(params);
return false;
};
export const asyncAbpOAuthGuard: CanActivateFn = (
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot,
) => {
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({ returnUrl: state.url });
return of(false);
})
)
);
}
if (authService.isAuthenticated) {
return true;
}
authService.navigateToLogin({ returnUrl: state.url });
return false;
};

7
npm/ng-packs/packages/oauth/src/lib/providers/oauth-module-config.provider.ts

@ -2,6 +2,7 @@ import {
AuthService,
AuthGuard,
authGuard,
asyncAuthGuard,
ApiInterceptor,
PIPE_TO_LOGIN_FN_KEY,
CHECK_AUTHENTICATION_STATE_FN_KEY,
@ -11,7 +12,7 @@ import {
import { Provider, makeEnvironmentProviders, inject, provideAppInitializer } from '@angular/core';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { OAuthModule, OAuthStorage } from 'angular-oauth2-oidc';
import { AbpOAuthGuard, abpOAuthGuard } from '../guards';
import { AbpOAuthGuard, abpOAuthGuard, asyncAbpOAuthGuard, } from '../guards';
import { OAuthConfigurationHandler } from '../handlers';
import { OAuthApiInterceptor } from '../interceptors';
import { AbpOAuthService, OAuthErrorFilterService } from '../services';
@ -31,6 +32,10 @@ export function provideAbpOAuth() {
{
provide: authGuard,
useValue: abpOAuthGuard,
},
{
provide: asyncAuthGuard,
useValue: asyncAbpOAuthGuard,
},
{
provide: ApiInterceptor,

Loading…
Cancel
Save