Fix the login flashing sometimes
Race condition between being able to login via OIDC in the background, and making first requests
This commit is contained in:
parent
a122ae07a9
commit
08914f7546
3 changed files with 29 additions and 4 deletions
16
UI/Web/src/app/_resolvers/oidc.resolver.ts
Normal file
16
UI/Web/src/app/_resolvers/oidc.resolver.ts
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
import {ActivatedRouteSnapshot, Resolve, RouterStateSnapshot} from '@angular/router';
|
||||||
|
import {Injectable} from "@angular/core";
|
||||||
|
import {Observable, take} from "rxjs";
|
||||||
|
import {OidcService} from "../_services/oidc.service";
|
||||||
|
|
||||||
|
@Injectable({
|
||||||
|
providedIn: 'root'
|
||||||
|
})
|
||||||
|
export class OidcResolver implements Resolve<any> {
|
||||||
|
|
||||||
|
constructor(private oidcService: OidcService) {}
|
||||||
|
|
||||||
|
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {
|
||||||
|
return this.oidcService.loaded$.pipe(take(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import {DestroyRef, effect, inject, Injectable, signal} from '@angular/core';
|
import {DestroyRef, effect, inject, Injectable, signal} from '@angular/core';
|
||||||
import {OAuthErrorEvent, OAuthService} from "angular-oauth2-oidc";
|
import {OAuthErrorEvent, OAuthService} from "angular-oauth2-oidc";
|
||||||
import {BehaviorSubject, from} from "rxjs";
|
import {BehaviorSubject, from, Observable} from "rxjs";
|
||||||
import {HttpClient} from "@angular/common/http";
|
import {HttpClient} from "@angular/common/http";
|
||||||
import {environment} from "../../environments/environment";
|
import {environment} from "../../environments/environment";
|
||||||
import {OidcPublicConfig} from "../admin/_models/oidc-config";
|
import {OidcPublicConfig} from "../admin/_models/oidc-config";
|
||||||
|
|
@ -23,6 +23,8 @@ export class OidcService {
|
||||||
|
|
||||||
baseUrl = environment.apiUrl;
|
baseUrl = environment.apiUrl;
|
||||||
|
|
||||||
|
private readonly loaded = new BehaviorSubject<boolean>(false);
|
||||||
|
public readonly loaded$: Observable<boolean> = this.loaded.asObservable();
|
||||||
private readonly _ready = signal(false);
|
private readonly _ready = signal(false);
|
||||||
public readonly ready = this._ready.asReadonly();
|
public readonly ready = this._ready.asReadonly();
|
||||||
private readonly _settings = signal<OidcPublicConfig | undefined>(undefined);
|
private readonly _settings = signal<OidcPublicConfig | undefined>(undefined);
|
||||||
|
|
@ -42,6 +44,7 @@ export class OidcService {
|
||||||
|
|
||||||
this.config().subscribe(oidcSetting => {
|
this.config().subscribe(oidcSetting => {
|
||||||
if (!oidcSetting.authority) {
|
if (!oidcSetting.authority) {
|
||||||
|
this.loaded.next(true);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -72,9 +75,8 @@ export class OidcService {
|
||||||
});
|
});
|
||||||
|
|
||||||
from(this.oauth2.loadDiscoveryDocumentAndTryLogin()).subscribe({
|
from(this.oauth2.loadDiscoveryDocumentAndTryLogin()).subscribe({
|
||||||
next: success => {
|
next: _ => {
|
||||||
if (!success) return;
|
this.loaded.next(true);
|
||||||
|
|
||||||
this._ready.set(true);
|
this._ready.set(true);
|
||||||
},
|
},
|
||||||
error: error => {
|
error: error => {
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,19 @@ import {NgModule} from '@angular/core';
|
||||||
import {PreloadAllModules, RouterModule, Routes} from '@angular/router';
|
import {PreloadAllModules, RouterModule, Routes} from '@angular/router';
|
||||||
import {AuthGuard} from './_guards/auth.guard';
|
import {AuthGuard} from './_guards/auth.guard';
|
||||||
import {LibraryAccessGuard} from './_guards/library-access.guard';
|
import {LibraryAccessGuard} from './_guards/library-access.guard';
|
||||||
|
import {OidcResolver} from "./_resolvers/oidc.resolver";
|
||||||
|
|
||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
{
|
{
|
||||||
path: '',
|
path: '',
|
||||||
canActivate: [AuthGuard],
|
canActivate: [AuthGuard],
|
||||||
runGuardsAndResolvers: 'always',
|
runGuardsAndResolvers: 'always',
|
||||||
|
resolve: {
|
||||||
|
// Require OIDC discovery to be loaded before launching the app
|
||||||
|
// making sure we don't flash the login screen because we've made request before we could auto login
|
||||||
|
// If no OIDC is set up, this will resolve after one request to the backend
|
||||||
|
_: OidcResolver,
|
||||||
|
},
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: 'settings',
|
path: 'settings',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue