Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migration vers ProConnect #19

Merged
merged 22 commits into from
Oct 26, 2024
Merged

Migration vers ProConnect #19

merged 22 commits into from
Oct 26, 2024

Conversation

ikarius
Copy link
Contributor

@ikarius ikarius commented Oct 23, 2024

ℹ️ PR créée à partir des PR originales gip-inclusion/dora-back#325 et gip-inclusion/dora-front#460 suite à la création du monorepo.

Backend migration ProConnect

Cette PR ajoute la couche technique OIDC nécessaire à une connexion à ProConnect (PC).
La couche de connexion Inclusion-Connect (IC) reste en place comme solution de repli en cas de problèmes lors du déploiement de PC.

Utilisation de mozilla-django-oidc

La quasi-totalité du flow OIDC est géré par la librairie mozilla-django-oidc choisie pour sa simplicité et parce que déjà utilisée par d'autres startups de l'écosystème beta.gouv.

Son code est simple, lisible et peut-être facilement assimilé et étendu au besoin (ce qui est notre cas).

La mise en oeuvre de mozilla-django-oidc est essentiellement déclarative :
la plupart des actions, endpoints, callbacks .. sont configurables via de simple `settings Django.

Pour les aspects :
- création et récupération d'utilisateur,
- personnalisation des interactions : SAFIR, SIRET ...
- déconnexion

certaines portions de la librairie ont dues être enrobées ou étendues pour ajouter ces fonctionnalités.

Configuration de Django pour PC :

Voir tous les paramètres Django préfixés OIDC_ , ainsi que :
- LOGIN_REDIRECT_URL
- LOGOUT_REDIRECT_URL : pour les 2 étapes de déconnexion,
- OIDC_CALLBACK_CLASS : pour le gestionnaire d'identification personnalisé.

Description des particularités DORA / PC

Connexion au frontend

Pour la connectique IC, certaines parties du flow OIDC sont implémentées coté frontend (appels initiaux, callbacks).

Pour PC, tout est centralisé au niveau du backend.

Une fois le flow OIDC terminé, un token DRF est transmis à la partie frontend pour être stocké sous forme d'entrée localStorage (même mécanisme que pour la connexion actuelle avec IC).

Ce mécanisme devra être revu, ou au moins renforcé une fois IC complètement décommissionné.

Ajouts d'étapes intermédiaires dans le flow OIDC

oidc/oidc_logged_in

Après le callback d'identification OIDC pour permettre :
- de gérer correctement la redirection en cas de next_url ,
- de passer le token DRF au frontend.

oidc/oidc_pre_logout

Une déconnexion complète avec PC nécessite 2 étapes, dans l'ordre :

  • effacement des données PC sur le site PC via un token stocké à la connexion et un endpoint spécifique (effacement des cookies du domaines PC),
  • l'effacement de la session sur le serveur Django.

Mal gérer cette phase mène à des états de connexion instables et dans certains cas des problèmes de redirections infinies.

Adaptation de certaines fonctions OIDC

Essentiellement représentées par des vues Django et le gestionnaire d'identification.

Vue CustomLogoutView

Enrobe la vue de déconnexion de mozilla-django-oidc pour permettre les deux étapes :

  • vérification d'un state ,
  • redirection vers le logout de PC,
  • effacement de la session Django.

Vue CustomAuthorizationCallbackView

Permet essentiellement de bien gérer le paramètre next_url et d'effectuer correctement la redirection entre backend et frontend après une identification réussie.

Gestionnaire OIDCAuthenticationBackend

La création d'un gestionnaire d'identification personnalisé est nécessaire pour plusieurs raisons.

D'abord à cause d'un problème (?) d'implémentation par PC lors du retour du token JWT.

Le type de contenu de la réponse n'est pas celui attendu, et un reformatage du token est nécessaire pour éviter une erreur de traitement (voir get_user_info).

Ensuite les traditionnelles étapes de création ou de récupération d'un utilisateur existant après une identification réussie doivent être améliorés pour :

  • la récupération du SIRET et éventuellement du code SAFIR,
  • utiliser un token DRF plutôt que l'identification par défaut de Django,
  • le stockage du sub OIDC en base (pour l'instant pas utilisé).

Voir les méthodes :

  • get_user,
  • update_user,
  • create_user,
  • get_user_info : pour le reformatage du token.

Frontend migration ProConnect

Cette PR n'est pas prête pour la production car elle contient les accès aux 2 systèmes d'identification (IC et PC).

Assez peu de choses sur la partie frontend, la plupart des actions du flow OIDC étant effectuées coté backend.

ikarius and others added 15 commits October 3, 2024 21:28
En 2 phases :
- effacement du token coté frontend
- finalisation de la déconnexion coté backend
- ajouts des routes pesonnalisées OIDC pour les redirections vers le
front-end
- modification de certaines portions de `mozilla-django-oidc` avec une
vue custom
Ainsi que sa configuration et la modification des routes pour permettre
à la fois l'utilisation de ProConnect et d'Inclusion-Connect
En 2 étapes déjà gérées, mais cette fois-ci en véfifiant l'état du
paramètre `state` passé par ProConnect (sécurité).
Dans la configuration précédente, seule l'identification par OIDC était
possible.
Mais la partie admin de Django à besoin de l'identification par "modéle"
(qui est celle par défaut).
Les deux oexistent sereinement maintenant.
Même si on n'en fait encore rien, le point de récupération de la donnée
est identifié dans le code.
Résidu des tests, maintenant l'absence d'e-mail doit lever une
exception.
On peut encore choisir entre Inclusion Connect et ProConnect via la
var-env OIDC_AUTH_BACKEND (par défaut `proconnect`)
@ikarius ikarius self-assigned this Oct 23, 2024
@ikarius ikarius changed the title Pro connect migration Migration vers ProConnect Oct 23, 2024
Copy link
Contributor

@ggounot ggounot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sacré travail. C'est propre et très bien documenté. Chapeau !

Petit soucis cependant :

Après avoir fait une recherche, je me connecte avec Pro Connect.

Mon URL passée par par le paramètre next est : /recherche?city=75112&cl=Paris (75)&l=Rue de Lyon 75012 Paris&lat=48.849221&lon=2.370927

À la fin du processus d'identification, je suis redirigé vers : /recherche?city=75112
Il y a donc perte de paramètres de l'URL.

En revanche, quand je me connecte à partir d'une page service avec seulement l'ID de la recherche dans l'URL : /services/bimbamjob-jlgu-titre-professionnel-?searchId=194805 je suis bien redirigé vers cette exacte URL.

back/dora/oidc/views.py Show resolved Hide resolved
front/src/app.postcss Outdated Show resolved Hide resolved
@ggounot
Copy link
Contributor

ggounot commented Oct 23, 2024

@ikarius ikarius force-pushed the pro-connect-migration branch 2 times, most recently from 6cb5cfe to 963688e Compare October 24, 2024 15:13
Moyen détourné de reporter la responsabilité de la validité des subs
fournis vers ProConnect (ce qui est présentement le cas).
L'affichage vers Inclusion Connect est toujours possible.
@ikarius ikarius force-pushed the pro-connect-migration branch 2 times, most recently from 656ab6e to 3568862 Compare October 24, 2024 16:13
front/src/app.postcss Outdated Show resolved Hide resolved
front/src/lib/components/specialized/pc-button.svelte Outdated Show resolved Hide resolved
front/src/lib/components/specialized/pc-button.svelte Outdated Show resolved Hide resolved
front/src/lib/components/specialized/pc-button.svelte Outdated Show resolved Hide resolved
front/src/lib/components/specialized/pc-button.svelte Outdated Show resolved Hide resolved
front/src/routes/auth/connexion/+page.svelte Outdated Show resolved Hide resolved
front/src/routes/auth/connexion/+page.svelte Outdated Show resolved Hide resolved
front/src/routes/auth/connexion/+page.svelte Outdated Show resolved Hide resolved
front/src/routes/auth/connexion/+page.svelte Outdated Show resolved Hide resolved
@ikarius ikarius force-pushed the pro-connect-migration branch 2 times, most recently from a1b2961 to f962869 Compare October 25, 2024 09:13
@ikarius ikarius requested a review from ggounot October 25, 2024 09:35
@ikarius ikarius force-pushed the pro-connect-migration branch from 842f064 to 84b1099 Compare October 25, 2024 09:59
@ikarius ikarius force-pushed the pro-connect-migration branch from 84b1099 to a323054 Compare October 25, 2024 13:21
@ikarius ikarius force-pushed the pro-connect-migration branch from a323054 to 1ac6063 Compare October 26, 2024 05:57
@ikarius ikarius requested a review from ggounot October 26, 2024 05:58
@ikarius
Copy link
Contributor Author

ikarius commented Oct 26, 2024

Je viens de marquer les deux dernières correction de typos comme terminées.
Je passe la migration ProConnect en staging pour vérifications avant lundi.

@ikarius ikarius merged commit 8fd1460 into main Oct 26, 2024
7 checks passed
@ikarius ikarius deleted the pro-connect-migration branch October 26, 2024 06:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants