Browse Source

Merge pull request #16643 from abpframework/auto-merge/rel-7-1/1956

Merge branch rel-7.2 with rel-7.1
pull/16644/head
Mahmut Gundogdu 3 years ago
committed by GitHub
parent
commit
848f591cae
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      npm/ng-packs/packages/oauth/src/lib/guards/oauth.guard.ts
  2. 5
      npm/ng-packs/packages/oauth/src/lib/strategies/auth-code-flow-strategy.ts
  3. 37
      npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts
  4. 19
      npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts

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

@ -1,5 +1,5 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { CanActivate, UrlTree } from '@angular/router'; import { CanActivate, UrlTree, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { OAuthService } from 'angular-oauth2-oidc'; import { OAuthService } from 'angular-oauth2-oidc';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { AuthService, IAuthGuard } from '@abp/ng.core'; import { AuthService, IAuthGuard } from '@abp/ng.core';
@ -10,13 +10,17 @@ import { AuthService, IAuthGuard } from '@abp/ng.core';
export class AbpOAuthGuard implements CanActivate, IAuthGuard { export class AbpOAuthGuard implements CanActivate, IAuthGuard {
constructor(private oauthService: OAuthService, private authService: AuthService) {} constructor(private oauthService: OAuthService, private authService: AuthService) {}
canActivate(): Observable<boolean> | boolean | UrlTree { canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot,
): Observable<boolean> | boolean | UrlTree {
const hasValidAccessToken = this.oauthService.hasValidAccessToken(); const hasValidAccessToken = this.oauthService.hasValidAccessToken();
if (hasValidAccessToken) { if (hasValidAccessToken) {
return true; return true;
} }
this.authService.navigateToLogin(); const params = { returnUrl: state.url };
this.authService.navigateToLogin(params);
return false; return false;
} }
} }

5
npm/ng-packs/packages/oauth/src/lib/strategies/auth-code-flow-strategy.ts

@ -14,7 +14,10 @@ export class AuthCodeFlowStrategy extends AuthFlowStrategy {
} }
navigateToLogin(queryParams?: Params) { navigateToLogin(queryParams?: Params) {
this.oAuthService.initCodeFlow('', this.getCultureParams(queryParams)); const additionalState = queryParams.returnUrl;
const cultureParams = this.getCultureParams(queryParams);
this.oAuthService.initCodeFlow(additionalState, cultureParams);
} }
checkIfInternalAuth(queryParams?: Params) { checkIfInternalAuth(queryParams?: Params) {

37
npm/ng-packs/packages/oauth/src/lib/strategies/auth-flow-strategy.ts

@ -1,5 +1,5 @@
import { Injector } from '@angular/core'; import { Injector } from '@angular/core';
import { Params } from '@angular/router'; import { Params, Router } from '@angular/router';
import { import {
AuthConfig, AuthConfig,
OAuthErrorEvent, OAuthErrorEvent,
@ -7,7 +7,7 @@ import {
OAuthStorage, OAuthStorage,
} from 'angular-oauth2-oidc'; } from 'angular-oauth2-oidc';
import { Observable, of } from 'rxjs'; import { Observable, of } from 'rxjs';
import { filter, switchMap, tap } from 'rxjs/operators'; import { filter, map, switchMap, take, tap } from 'rxjs/operators';
import { import {
AbpLocalStorageService, AbpLocalStorageService,
ConfigStateService, ConfigStateService,
@ -32,13 +32,11 @@ export abstract class AuthFlowStrategy {
protected sessionState: SessionStateService; protected sessionState: SessionStateService;
protected localStorageService: AbpLocalStorageService; protected localStorageService: AbpLocalStorageService;
protected tenantKey: string; protected tenantKey: string;
protected router: Router;
abstract checkIfInternalAuth(queryParams?: Params): boolean; abstract checkIfInternalAuth(queryParams?: Params): boolean;
abstract navigateToLogin(queryParams?: Params): void; abstract navigateToLogin(queryParams?: Params): void;
abstract logout(queryParams?: Params): Observable<any>; abstract logout(queryParams?: Params): Observable<any>;
abstract login(params?: LoginParams | Params): Observable<any>; abstract login(params?: LoginParams | Params): Observable<any>;
private catchError = (err: HttpErrorResponse) => { private catchError = (err: HttpErrorResponse) => {
@ -55,6 +53,7 @@ export abstract class AuthFlowStrategy {
this.localStorageService = injector.get(AbpLocalStorageService); this.localStorageService = injector.get(AbpLocalStorageService);
this.oAuthConfig = this.environment.getEnvironment().oAuthConfig || {}; this.oAuthConfig = this.environment.getEnvironment().oAuthConfig || {};
this.tenantKey = injector.get(TENANT_KEY); this.tenantKey = injector.get(TENANT_KEY);
this.router = injector.get(Router);
this.listenToOauthErrors(); this.listenToOauthErrors();
} }
@ -71,6 +70,8 @@ export abstract class AuthFlowStrategy {
.pipe(filter(event => event.type === 'token_refresh_error')) .pipe(filter(event => event.type === 'token_refresh_error'))
.subscribe(() => this.navigateToLogin()); .subscribe(() => this.navigateToLogin());
this.navigateToPreviousUrl();
return this.oAuthService return this.oAuthService
.loadDiscoveryDocument() .loadDiscoveryDocument()
.then(() => { .then(() => {
@ -83,6 +84,32 @@ export abstract class AuthFlowStrategy {
.catch(this.catchError); .catch(this.catchError);
} }
protected navigateToPreviousUrl(): void {
const { responseType } = this.oAuthConfig;
if (responseType === 'code') {
this.oAuthService.events
.pipe(
filter(event => event.type === 'token_received' && !!this.oAuthService.state),
take(1),
map(() => {
const redirect_uri = decodeURIComponent(this.oAuthService.state);
if (redirect_uri && redirect_uri !== '/') {
return redirect_uri;
}
return '/';
}),
switchMap(redirectUri =>
this.configState.getOne$('currentUser').pipe(
filter(user => !!user?.isAuthenticated),
tap(() => this.router.navigate([redirectUri])),
),
),
)
.subscribe();
}
}
protected refreshToken() { protected refreshToken() {
return this.oAuthService.refreshToken().catch(() => clearOAuthStorage()); return this.oAuthService.refreshToken().catch(() => clearOAuthStorage());
} }

19
npm/ng-packs/packages/theme-shared/src/lib/handlers/error.handler.ts

@ -123,9 +123,11 @@ export class ErrorHandler {
} }
private executeErrorHandler = (error: any) => { private executeErrorHandler = (error: any) => {
const returnValue = this.httpErrorHandler(this.injector, error); const errHandler = this.httpErrorHandler(this.injector, error);
const isObservable = errHandler instanceof Observable;
const response = isObservable ? errHandler : of(null);
return (returnValue instanceof Observable ? returnValue : of(null)).pipe( return response.pipe(
catchError(err => { catchError(err => {
this.handleError(err); this.handleError(err);
return of(null); return of(null);
@ -139,6 +141,11 @@ export class ErrorHandler {
defaultValue: DEFAULT_ERROR_MESSAGES.defaultError.title, defaultValue: DEFAULT_ERROR_MESSAGES.defaultError.title,
}; };
if (err instanceof HttpErrorResponse && err.headers.get('Abp-Tenant-Resolve-Error')) {
this.authService.logout().subscribe();
return;
}
if (err instanceof HttpErrorResponse && err.headers.get('_AbpErrorFormat')) { if (err instanceof HttpErrorResponse && err.headers.get('_AbpErrorFormat')) {
const confirmation$ = this.showErrorWithRequestBody(body); const confirmation$ = this.showErrorWithRequestBody(body);
@ -147,8 +154,6 @@ export class ErrorHandler {
this.navigateToLogin(); this.navigateToLogin();
}); });
} }
} if(err instanceof HttpErrorResponse && err.headers.get('Abp-Tenant-Resolve-Error')){
this.authService.logout().subscribe();
} else { } else {
switch (err.status) { switch (err.status) {
case 401: case 401:
@ -178,7 +183,7 @@ export class ErrorHandler {
status: 403, status: 403,
}); });
break; break;
case 404:{ case 404:
this.canCreateCustomError(404) this.canCreateCustomError(404)
? this.show404Page() ? this.show404Page()
: this.showError( : this.showError(
@ -191,9 +196,7 @@ export class ErrorHandler {
defaultValue: DEFAULT_ERROR_MESSAGES.defaultError404.title, defaultValue: DEFAULT_ERROR_MESSAGES.defaultError404.title,
}, },
); );
break; break;
}
case 500: case 500:
this.createErrorComponent({ this.createErrorComponent({
title: { title: {

Loading…
Cancel
Save