feat: init and fork some code from angular-auth-oidc-client
Some checks are pending
Build, Lint & Test Lib / Built, Lint and Test Library (push) Waiting to run
Build, Lint & Test Lib / Angular latest (push) Blocked by required conditions
Build, Lint & Test Lib / Angular latest & Schematics Job (push) Blocked by required conditions
Build, Lint & Test Lib / Angular latest Standalone & Schematics Job (push) Blocked by required conditions
Build, Lint & Test Lib / Angular 16 & RxJs 6 (push) Blocked by required conditions
Build, Lint & Test Lib / Angular V16 (push) Blocked by required conditions
Docs / Build and Deploy Docs Job (push) Waiting to run
Docs / Close Pull Request Job (push) Waiting to run

This commit is contained in:
2025-01-18 01:05:00 +08:00
parent 276d9fbda8
commit 983254164b
201 changed files with 35689 additions and 0 deletions

View File

@@ -0,0 +1,148 @@
import { inject, Injectable } from 'injection-js';
import {
ActivatedRouteSnapshot,
Router,
RouterStateSnapshot,
} from '@angular/router';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { AuthOptions } from '../auth-options';
import { AuthStateService } from '../auth-state/auth-state.service';
import { ConfigurationService } from '../config/config.service';
import { LoginService } from '../login/login.service';
import { AutoLoginService } from './auto-login.service';
@Injectable()
export class AutoLoginPartialRoutesGuard {
private readonly autoLoginService = inject(AutoLoginService);
private readonly authStateService = inject(AuthStateService);
private readonly loginService = inject(LoginService);
private readonly configurationService = inject(ConfigurationService);
private readonly router = inject(Router);
canLoad(): Observable<boolean> {
const url =
this.router
.getCurrentNavigation()
?.extractedUrl.toString()
.substring(1) ?? '';
return checkAuth(
url,
this.configurationService,
this.authStateService,
this.autoLoginService,
this.loginService
);
}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> {
const authOptions: AuthOptions | undefined = route?.data
? { customParams: route.data }
: undefined;
return checkAuth(
state.url,
this.configurationService,
this.authStateService,
this.autoLoginService,
this.loginService,
authOptions
);
}
canActivateChild(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> {
const authOptions: AuthOptions | undefined = route?.data
? { customParams: route.data }
: undefined;
return checkAuth(
state.url,
this.configurationService,
this.authStateService,
this.autoLoginService,
this.loginService,
authOptions
);
}
}
export function autoLoginPartialRoutesGuard(
route?: ActivatedRouteSnapshot,
state?: RouterStateSnapshot,
configId?: string
): Observable<boolean> {
const configurationService = inject(ConfigurationService);
const authStateService = inject(AuthStateService);
const loginService = inject(LoginService);
const autoLoginService = inject(AutoLoginService);
const router = inject(Router);
const authOptions: AuthOptions | undefined = route?.data
? { customParams: route.data }
: undefined;
const url =
router.getCurrentNavigation()?.extractedUrl.toString().substring(1) ?? '';
return checkAuth(
url,
configurationService,
authStateService,
autoLoginService,
loginService,
authOptions,
configId
);
}
export function autoLoginPartialRoutesGuardWithConfig(
configId: string
): (
route?: ActivatedRouteSnapshot,
state?: RouterStateSnapshot
) => Observable<boolean> {
return (route?: ActivatedRouteSnapshot, state?: RouterStateSnapshot) =>
autoLoginPartialRoutesGuard(route, state, configId);
}
function checkAuth(
url: string,
configurationService: ConfigurationService,
authStateService: AuthStateService,
autoLoginService: AutoLoginService,
loginService: LoginService,
authOptions?: AuthOptions,
configId?: string
): Observable<boolean> {
return configurationService.getOpenIDConfiguration(configId).pipe(
map((configuration) => {
const isAuthenticated =
authStateService.areAuthStorageTokensValid(configuration);
if (isAuthenticated) {
autoLoginService.checkSavedRedirectRouteAndNavigate(configuration);
}
if (!isAuthenticated) {
autoLoginService.saveRedirectRoute(configuration, url);
if (authOptions) {
loginService.login(configuration, authOptions);
} else {
loginService.login(configuration);
}
}
return isAuthenticated;
})
);
}