Authentification uniquement en Code Flow

develop
jboinembalome 4 years ago
parent f14bad4e3e
commit 22520add64
  1. 91
      src/app/shared/auth/auth.service.ts

@ -103,78 +103,29 @@ export class AuthService {
* Lance la séquence de connexion initiale. * Lance la séquence de connexion initiale.
*/ */
public runInitialLoginSequence(): Promise<void> { public runInitialLoginSequence(): Promise<void> {
if (location.hash) {
//console.log("Fragment de hachage rencontré, tracé sous forme de tableau...") ; // Charge la configuration de Keycloak et tente de se connecter
//console.table(location.hash.substr(1).split('&').map(kvp => kvp.split('='))); return this.oauthService.loadDiscoveryDocumentAndTryLogin()
}
// 0. CONFIGURATION DU CHARGEMENT:
// Il faut d'abord vérifier comment le serveur Keycloak est actuellement configuré:
return this.oauthService.loadDiscoveryDocument()
// 1. HASH LOGIN:
// Essaye de se connecter via le fragment de hachage
// après avoir été redirigé depuis le serveur Keycloak depuis initImplicitFlow :
.then(() => this.oauthService.tryLogin())
.then(() => { .then(() => {
// Si l'acces token est valide alors tout est ok
if (this.oauthService.hasValidAccessToken()) { if (this.oauthService.hasValidAccessToken()) {
return Promise.resolve(); return Promise.resolve();
} }
// 2. SILENT LOGIN: // Renvoie l'utilisateur vers la page de connexion
// Effectue un rafraîchissement silencieux pour le flux implicite. this.navigateToLoginPage();
// Utilise cette méthode pour obtenir des nouveaux tokens quand/avant que les tokens existants expirent.
return this.oauthService.silentRefresh()
.then(() => Promise.resolve())
.catch(result => {
// Sous-ensemble de situations de https://openid.net/specs/openid-connect-core-1_0.html#AuthError
// Seulement celles où il est raisonnablement certain que l'envoi de l'utilisateur au serveur Keycloak est utile.
const errorResponsesRequiringUserInteraction = [
'interaction_required',
'login_required',
'account_selection_required',
'consent_required',
];
if (result
&& result.reason
&& errorResponsesRequiringUserInteraction.indexOf(result.reason.error) >= 0) {
// 3. DEMANDE DE CONNEXION:
// A ce stade, nous savons avec certitude que nous devons demander à
// l'utilisateur de se connecter, nous le redirigeons donc vers la page de connexion.
// Activez cette option pour TOUJOURS forcer un utilisateur à se connecter.
this.login();
// Afficher un mesage d'avertissement:
//console.warn("Une interaction de l'utilisateur est nécessaire pour se connecter, nous allons attendre que l'utilisateur se connecte manuellement.");
return Promise.resolve();
}
return Promise.reject(result);
});
})
// Afficher un mesage d'avertissement:
//console.warn("Une interaction de l'utilisateur est nécessaire pour se connecter, l'utilisateur doit se connecter manuellement.");
return Promise.reject();
})
.then(() => { .then(() => {
// Met à jour l'observable isDoneLoadingSubject // Met à jour de l'observable isDoneLoadingSubject
this.isDoneLoadingSubject$.next(true); this.isDoneLoadingSubject$.next(true);
// Vérifie les valeurs "undefined" et "null" pour être sûr.
// Notre login actuel ne devrait jamais avoir cela, mais au cas
// où quelqu'un appellerait la méthode initImplicitFlow(undefined|null), cela pourrait arriver.
if (this.oauthService.state && this.oauthService.state !== 'undefined' && this.oauthService.state !== 'null') {
let stateUrl = this.oauthService.state;
if (stateUrl.startsWith('/') === false) {
stateUrl = decodeURIComponent(stateUrl);
}
//console.log(`Il y a eu l'état de ${this.oauthService.state}, donc nous vous envoyons à ${stateUrl}`) ;
this.router.navigateByUrl(stateUrl);
}
}) })
.catch(() => this.isDoneLoadingSubject$.next(true)); // Met à jour l'observable isDoneLoadingSubject .catch(() => this.isDoneLoadingSubject$.next(true)); // Met à jour l'observable isDoneLoadingSubject même si il y a une erreur
} }
/** /**
@ -182,9 +133,7 @@ export class AuthService {
* @param targetUrl Url de destination * @param targetUrl Url de destination
*/ */
public login(targetUrl?: string) { public login(targetUrl?: string) {
// Note : avant la version 9.1.0 de la librairie, il fallait this.oauthService.initCodeFlow(targetUrl || this.router.url);
// passer le composant encodageURIC dans les arguments de la méthode.
this.oauthService.initLoginFlow(targetUrl || this.router.url);
} }
/** /**
@ -207,7 +156,7 @@ export class AuthService {
*/ */
public get firstRole() { public get firstRole() {
if(this.identityClaims != null) if(this.identityClaims != null)
return this.oauthService.getIdentityClaims()['roles'][0]; return this.identityClaims['roles'][0];
else else
return; return;
} }
@ -217,7 +166,7 @@ export class AuthService {
*/ */
public get roles() { public get roles() {
if(this.identityClaims != null) if(this.identityClaims != null)
return this.oauthService.getIdentityClaims()['roles']; return this.identityClaims['roles'];
else else
return; return;
} }
@ -227,14 +176,14 @@ export class AuthService {
*/ */
public get userInfo() { public get userInfo() {
if(this.identityClaims != null) if(this.identityClaims != null)
return this.oauthService.getIdentityClaims()['name']; return this.identityClaims['name'];
else else
return; return;
} }
// Normalement, un service comme celui-ci ne les expose pas, // Normalement, ce genre de service ne les expose pas,
// mais pour le débogage, c'est logique. // mais pour le débogage, ça peut-être utile.
/** /**
* Access_token actuel. * Access_token actuel.

Loading…
Cancel
Save