Browse Source

Merge pull request #23389 from abpframework/issue-#23286

Add async auth guard support for OAuth routes
pull/23435/head
Yağmur Çelik 1 year ago
committed by GitHub
parent
commit
7d75e87b15
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 6
      npm/ng-packs/packages/core/src/lib/abstracts/auth.guard.ts
  2. 37
      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;
};

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

@ -6,10 +6,10 @@ import {
CanActivateFn,
} from '@angular/router';
import { Observable } from 'rxjs';
import { Observable, timer, filter, take, map, firstValueFrom, timeout, catchError, of } from 'rxjs';
import { OAuthService } from 'angular-oauth2-oidc';
import { AuthService, IAbpGuard } from '@abp/ng.core';
import { AuthService, IAbpGuard, EnvironmentService } from '@abp/ng.core';
/**
* @deprecated Use `abpOAuthGuard` *function* instead.
@ -53,3 +53,36 @@ export const abpOAuthGuard: CanActivateFn = (
authService.navigateToLogin(params);
return false;
};
export const asyncAbpOAuthGuard: CanActivateFn = (
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot,
) => {
const oAuthService = inject(OAuthService);
const authService = inject(AuthService);
const environmentService = inject(EnvironmentService);
const { oAuthConfig } = environmentService.getEnvironment();
if (oAuthConfig?.responseType === 'code') {
return firstValueFrom(
timer(0, 100).pipe(
map(() => oAuthService.hasValidAccessToken()),
filter(Boolean),
take(1),
timeout(3000),
catchError(() => {
authService.navigateToLogin({ returnUrl: state.url });
return of(false);
})
)
);
}
if (oAuthService.hasValidAccessToken()) {
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