Open jacquesfize opened 2 days ago
Peut-on envisager l'authentification avec Microsoft 365 ? Je ne sais pas du tout si c'est possible en revanche....
Ça semble possible: https://learn.microsoft.com/fr-fr/entra/identity-platform/v2-app-types#web-apps
Leur plateforme utilise le protocole OAuth2. Avec @TheoLechemia, on a implémenté un provider pour ce type de protocole.
Bonjour à tous,
Avec @TheoLechemia, nous travaillons sur l'ajout d'une fonctionnalité dans GeoNature permettant de se connecter à l'aide de différents fournisseurs d'identités ou provider. L'objectif est de permettre aux structures qui le souhaitent d'utiliser leurs propres fournisseurs d'identités pour se connecter à leur GeoNature. Par défaut, plusieurs providers sont intégrés dans le module
UsersHub-authentification-module
:Fonctionnement
Notions
Provider ? Instance d'un provider ? Un provider désigne un protocole de connexion, tandis qu'une instance d'un provider se réfère à une utilisation spécifique de ce protocole. Par exemple, le système d'authentification de GeoNature est utilisé à la fois par GeoNature du SINP PACA et par SINP AuRA. La principale différence entre ces deux instances réside dans leurs adresses d'accès et la base de données utilisateurs associées.
Avant/Après cette mise à jour
Avant.
Dans la version actuelle de GeoNature, il est possible de se connecter de deux manières :
Dans le cas par défaut, lors de la connexion, le frontend effectue une requête asynchrone vers la route /auth/login de l'API. L'API retourne les informations de l'utilisateur qui seront stockées dans le localStorage (
gn_token
,gn_current_user
etgn_expires_at
). Le token est qu'il permet à l'API d'identifier l'utilisateur lors des ces requêtes sur cette dernière.Dans le cas de l'INPN, l'utilisateur est automatiquement redirigé vers le portail de l'INPN lorsqu'il tente d'accéder à GeoNature. Une fois sur le portail, il doit saisir ses informations de connexion. Après une connexion réussie, une redirection est effectuée vers des routes spécifiques au CAS qui connecte l'utilisateur et renvoie son token d'identification au frontend.
Après.
Le fonctionnement initial du login est maintenu. La nouveauté réside dans la possibilité de se connecter à d'autres fournisseurs d'identités (FI) en s'appuyant sur des protocoles de connexions différents de GeoNature (OAuth, OAuth2, CAS, etc...). Côté Frontend, en cliquant pour se connecter à un FI, l'utilisateur sera rediriger vers l'API
/auth/login/<id_provider>
(id_provider correspond à l'idenfiant unique du FI). Cette API redirigera ensuite vers le portail de connexion de l'instance du fournisseur d'identités (Voir Figure ci-dessus).Une fois la connexion réussie, le portail redirige vers la route de l'API
auth/authorize/<id_provider>
qui se charge de réconcilier les informations utilisateur fournies par le FI avec le schéma de la base de données de GeoNature.Lors de la déconnexion, il est possible de se déconnecter du fournisseur d'identité ainsi que de GeoNature en utilisant la méthode
revoke()
définie par le provider.N.B. Il est possible de se connecter à plusieurs fournisseurs d'identités autres que celui de base !
Schéma.
Comment utiliser un autre fournisseur d'identités (FI) ?
Comme expliqué précédemment, UsersHub-authenfication-module vient avec un ensemble de protocole de connexion prédéfini dans des
Provider
.Si le fournisseur d'identité utilise un des protocoles de connexions existant, il suffit de remplir la configuration comme ci-dessous. Dans ce fichier de configuration, nous avons ajouté la possibilité de se connecter à:
Comment ça marche ?
Pour utiliser un fournisseur d'identité, il faut :
AUTHENTICATION.PROVIDERS
les classes Python dans lesquels sont déclarés les protocoles de connexion que vous souhaitez utiliser. Chaque classe hérite depypnusershub.auth.Authentication
. Dans l'exemple ci-dessus, la valeurpypnusershub.auth.providers.openid_provider.OpenIDProvider
permet de se connecter à un provider de type OpenID.** Voir dans l'attribut
name
dans la classe décrivant le protocole de connexionDans chaque configuration d'un fournisseur d'identité, il faut déclaré :
id_provider
(dans cette instance de GeoNature)logo
et lelabel
qui seront affichés sur la page de login.login_url
,logout_url
si le provider en a besoingroupe_mapping
pour la réconciliation entre les groupes du fournisseurs d'identité et celui dans GeoNature.Une fois la configuration mise à jour, vous devriez voir l'interface suivante.
Déclaration d'un protocole de connexion
La "brique" permettant de faire la connexion et la réconciliation (i.e synchronisation des données du fournisseurs et celle présente en local) sur différents fournisseurs d'identités.
Chaque protocole de connexion ou provider est défini par une classe comme celle-ci :
Un protocole de connexion est défini par 5 méthodes et plusieurs attributs.
Les attributs sont les suivants
id_provider
indique l'identifiant de l'instance du provider.logo
etlabel
sont destinés à l'interface utilisateur.is_uh
spécifie si le provider permet de se connecter à une autre application Flask utilisantUsersHub-authentification-module
.login_url
etlogout_url
, si le protocole de connexion nécessite une redirectiongroup_mapping
contient le mapping entre les groupes du fournisseurs d'identités et celui de votre instance de GeoNature.Les méthodes sont les suivantes :
authenticate
: Lancée sur la route/auth/login
, elle récupère les informations du formulaire de login et retourne un objetUser
. Si le protocole de connexion doit rediriger l'utilisateur vers un portail, alors authenticate retourne uneflask.Response
qui redirige vers ce dernier.authorize
: Cette méthode est lancée par la route/auth/authorize
qui récupère les informations renvoyés par le fournisseur d'identités après la connexions sur le portail.configuration_schema()
: Permet de déclarer le schéma de la configuration associée à ce protocole de connexion, par exemple les clés nécessaires pour l'API de Google. Ce schéma est un classe qui hérite deProviderConfigurationSchema
qui intègre les variables de configurations commun à tous les protocoles. Ces schémas utilisent lesSchema
de la librairiemarshmallow
.configure(self, configuration: Union[dict, Any])
: Permet de récupérer et d'utiliser les variables présentes dans le fichier de configuration.revoke()
: Permet de spécifier un fonctionnement spécifique lors de la déconnexion d'un utilisateur.Ajouter son propre provider
Si les protocoles de connexions fournis dans le module d'authentification ne répondent pas à vos besoins, vous pouvez créer les vôtres !
Pour ce faire, il suffit de créer une classe qui hérite de
Authentication
et qui implémente les méthodes suivantes :authenticate()
configuration_schema()
(pour définir la configuration de votre provider dans le fichier de configuration TOML)configure()
(pour indiquer comment les variables de configuration sont utilisées pour configurer le provider)et les attributs suivants :
name
is_uh
D'autres méthodes et attributs sont disponibles, voir la classe Authentication.
Comme les autres protocoles de connexions, il suffit d'indiquer le chemin vers votre classe Python et sa configuration pour le fournisseur d'identité utilisant ce dernier !