Project

General

Profile

Development #62710

rapatriement du script client de synchronisation depuis le plugin authentic2-gnm vers auth_oidc

Added by Paul Marillonnet about 1 year ago. Updated 6 months ago.

Status:
Fermé
Priority:
Normal
Category:
-
Target version:
-
Start date:
13 March 2022
Due date:
% Done:

0%

Estimated time:
Patch proposed:
Yes
Planning:
No

Description

C’est spécifique à a2 client oidc d’un autre a2 fournisseur, et c’est spécifique à une config oidc où les subs délivrés sont des pseudonymes réversibles.
Je me disais que rapatrier tout cela dans auth_oidc permettrait de mieux tester le couplage avec la réversibilité des pseudonymes servis dans la partie idp_oidc.


Files

0001-auth_oidc-add-an-oidc-sync-provider-command-62710.patch (10.6 KB) 0001-auth_oidc-add-an-oidc-sync-provider-command-62710.patch Paul Marillonnet, 01 June 2022 09:51 AM
0001-auth_oidc-add-an-oidc-sync-provider-command-62710.patch (11.7 KB) 0001-auth_oidc-add-an-oidc-sync-provider-command-62710.patch Paul Marillonnet, 01 June 2022 03:41 PM
0001-WIP-auth_oidc-add-an-oidc-sync-provider-command-6271.patch (14.2 KB) 0001-WIP-auth_oidc-add-an-oidc-sync-provider-command-6271.patch Paul Marillonnet, 04 August 2022 09:43 AM
0001-auth_oidc-add-an-oidc-sync-provider-command-62710.patch (15.1 KB) 0001-auth_oidc-add-an-oidc-sync-provider-command-62710.patch Paul Marillonnet, 05 August 2022 11:16 AM
0001-auth_oidc-add-an-oidc-sync-provider-command-62710.patch (15.3 KB) 0001-auth_oidc-add-an-oidc-sync-provider-command-62710.patch Paul Marillonnet, 05 August 2022 12:08 PM
0001-management-add-a-LogToConsoleCommand-base-class-6271.patch (4.91 KB) 0001-management-add-a-LogToConsoleCommand-base-class-6271.patch Paul Marillonnet, 05 August 2022 01:56 PM
0002-auth_oidc-add-an-oidc-sync-provider-command-62710.patch (15.2 KB) 0002-auth_oidc-add-an-oidc-sync-provider-command-62710.patch Paul Marillonnet, 05 August 2022 01:56 PM
0002-auth_oidc-add-an-oidc-sync-provider-command-62710.patch (15.1 KB) 0002-auth_oidc-add-an-oidc-sync-provider-command-62710.patch Benjamin Dauvergne, 25 October 2022 11:28 AM
0001-management-add-a-LogToConsoleCommand-base-class-6271.patch (4.91 KB) 0001-management-add-a-LogToConsoleCommand-base-class-6271.patch Benjamin Dauvergne, 25 October 2022 11:28 AM
0001-management-add-a-LogToConsoleCommand-base-class-6271.patch (4.91 KB) 0001-management-add-a-LogToConsoleCommand-base-class-6271.patch Paul Marillonnet, 28 October 2022 09:40 AM
0002-auth_oidc-add-an-oidc-sync-provider-command-62710.patch (15.5 KB) 0002-auth_oidc-add-an-oidc-sync-provider-command-62710.patch Paul Marillonnet, 28 October 2022 09:40 AM
0001-management-add-a-LogToConsoleCommand-base-class-6271.patch (4.91 KB) 0001-management-add-a-LogToConsoleCommand-base-class-6271.patch Paul Marillonnet, 14 December 2022 11:30 AM
0002-auth_oidc-add-an-oidc-sync-provider-command-62710.patch (15.3 KB) 0002-auth_oidc-add-an-oidc-sync-provider-command-62710.patch Paul Marillonnet, 14 December 2022 11:30 AM

Related issues

Related to Authentic 2 - Development #65877: idp_oidc : les hooks de l’api /users/ doivent tenir compte de la résolution des claims lorsque l’appelant est un client oidc connuEn cours01 June 2022

Actions
Related to Authentic 2 - Development #65890: idp_oidc: tolérer la synchro pour les clients en identifier_policy:=POLICY_UUIDNouveau01 June 2022

Actions
Related to Authentic 2 - Development #70805: script de synchronisation : pour un client activant la gestion des profils PM, l’endpoint doit retourner les subs correspondant à ces profilsRejeté28 October 2022

Actions
Related to Authentic 2 - Development #72418: auth_oidc : factorisation de la résolution du mapping de claim entre le backend d’authn et la synchronisationFermé14 December 2022

Actions

Associated revisions

Revision 2aeb5bad (diff)
Added by Paul Marillonnet 6 months ago

management: add a LogToConsoleCommand base class (#62710)

Revision 73ac9f07 (diff)
Added by Paul Marillonnet 6 months ago

auth_oidc: add an oidc-sync-provider command (#62710)

History

#2

Updated by Paul Marillonnet about 1 year ago

  • Subject changed from gestion des personnes morales : rapatriement de l’api de synchro dans le module auth_oidc (?) to gestion des personnes morales : rapatriement du script client de synchro dans le module auth_oidc (?)

(actuellement le script est dans le plugin authentic2-gnm, commande sync-cut.py).

#5

Updated by Paul Marillonnet about 1 year ago

  • Subject changed from gestion des personnes morales : rapatriement du script client de synchro dans le module auth_oidc (?) to rapatriement du script client de synchronisation depuis le plugin authentic2-gnm vers auth_oidc
#6

Updated by Paul Marillonnet about 1 year ago

  • Status changed from Nouveau to En cours
  • Assignee set to Paul Marillonnet
#7

Updated by Paul Marillonnet about 1 year ago

Dans la branche, une copie assez conforme de ce qui existe dans le plugin, copie testée elle aussi. Je vais voir s’il est judicieux de rajouter des tests.

#8

Updated by Paul Marillonnet about 1 year ago

Une version qui se base sur deux hypothèses :
· on connaît le slug du fournisseur vers lequel on veut se synchroniser, slug que l’on passe en paramètre de la commande ;
· l’attribut 'issuer' du fournisseur correspond à son fqdn du point de vue du client.
Cela me paraît être deux hypothèses raisonnables, mais si l’une ou l’autre s’avère fausse pour le chantier qui motive ce ticket, je reverrai ma copie.

#10

Updated by Paul Marillonnet about 1 year ago

  • Status changed from Solution proposée to En cours

Paul Marillonnet a écrit :

Une version qui se base sur deux hypothèses :
· on connaît le slug du fournisseur vers lequel on veut se synchroniser, slug que l’on passe en paramètre de la commande ;
· l’attribut 'issuer' du fournisseur correspond à son fqdn du point de vue du client.
Cela me paraît être deux hypothèses raisonnables, mais si l’une ou l’autre s’avère fausse pour le chantier qui motive ce ticket, je reverrai ma copie.

Le test ne va pas, je recommence.

#11

Updated by Paul Marillonnet about 1 year ago

Et bien sûr il y a tout un pan du problème qui m’avait échappé : la synchro des usagers modifiés se fait entre un fournisseur et un rp oidc, il ne faut pas renvoyer les attributs usager bruts de fonderie, mais tenir compte de la configuration des mappings de claim entre ces deux entités OIDC.

Dans le plugin GL on se simplifiait la tâche car le mapping était connu, les modifications tenant compte de cette config avaient lieu en dur dans le code.
Ici c’est plus complexe, il va falloir détecter que l’appelant de l’/api/users/?modified__gt=… est par ailleurs un client oidc pour authentic, et parvenir à la substitution des attributs en claims conformément à la configuration de ce client.

Tâche non triviale, j’ai quelques idées mais aucune arrêtée pour l’instant. Peut-être un paramètre de qs supplémentaire dans cette api pour passer le slug du client oidc appelant ?
Je revois ma copie.

#12

Updated by Frédéric Péters about 1 year ago

il va falloir détecter que l’appelant de l’/api/users/?modified__gt=… est par ailleurs un client oidc pour authentic, et parvenir à la substitution des attributs en claims conformément à la configuration de ce client.

Le script appelle /api/users/?... qui est une API standard d'authentic, le propos ici est que le script de synchro du dépôt authentic2-gnm fonctionne parce qu'en face l'/api/users/? n'est en fait pas l'API standard d'authentic mais une API modifiée par authentic2-cut ?

(je ne capte pas)

#13

Updated by Paul Marillonnet about 1 year ago

Frédéric Péters a écrit :

il va falloir détecter que l’appelant de l’/api/users/?modified__gt=… est par ailleurs un client oidc pour authentic, et parvenir à la substitution des attributs en claims conformément à la configuration de ce client.

Le script appelle /api/users/?... qui est une API standard d'authentic, le propos ici est que le script de synchro du dépôt authentic2-gnm fonctionne parce qu'en face l'/api/users/? n'est en fait pas l'API standard d'authentic mais une API modifiée par authentic2-cut ?

Oui voilà, il y a ce fameux hook planqué dans un coin, qui change complètement le sérialiseur et donc le contenu de la réponse : https://git.entrouvert.org/authentic2-cut.git/tree/src/authentic2_cut/apps.py#n290
Ici dans ce hook on sait à quoi ressemble la configuration de mapping de claims GL -> Toodego (par exemple on sait qu’on peut placer directement le contenu de user.last_name dans family_name, ligne 322), mais dans le cas général il faut inspecter cette configuration et résoudre les claims usager par usager.

#14

Updated by Paul Marillonnet about 1 year ago

  • Related to Development #65877: idp_oidc : les hooks de l’api /users/ doivent tenir compte de la résolution des claims lorsque l’appelant est un client oidc connu added
#15

Updated by Paul Marillonnet about 1 year ago

Paul Marillonnet a écrit :

Frédéric Péters a écrit :

il va falloir détecter que l’appelant de l’/api/users/?modified__gt=… est par ailleurs un client oidc pour authentic, et parvenir à la substitution des attributs en claims conformément à la configuration de ce client.

Le script appelle /api/users/?... qui est une API standard d'authentic, le propos ici est que le script de synchro du dépôt authentic2-gnm fonctionne parce qu'en face l'/api/users/? n'est en fait pas l'API standard d'authentic mais une API modifiée par authentic2-cut ?

Oui voilà, il y a ce fameux hook planqué dans un coin, qui change complètement le sérialiseur et donc le contenu de la réponse : https://git.entrouvert.org/authentic2-cut.git/tree/src/authentic2_cut/apps.py#n290
Ici dans ce hook on sait à quoi ressemble la configuration de mapping de claims GL -> Toodego (par exemple on sait qu’on peut placer directement le contenu de user.last_name dans family_name, ligne 322), mais dans le cas général il faut inspecter cette configuration et résoudre les claims usager par usager.

J’ai créé #65877 pour cette partie, sinon on ne va pas s’en sortir.

#16

Updated by Paul Marillonnet about 1 year ago

Paul Marillonnet a écrit :

J’ai créé #65877 pour cette partie, sinon on ne va pas s’en sortir.

Et donc de ce côté ci, le patche.

#17

Updated by Paul Marillonnet about 1 year ago

  • Related to Development #65890: idp_oidc: tolérer la synchro pour les clients en identifier_policy:=POLICY_UUID added
#19

Updated by Benjamin Dauvergne 11 months ago

  • Status changed from Solution proposée to En cours

La gestion du --delta me parait un peu foireuse, il suffit qu'on saute une exécution (cron n'a rien d'exact) pour perdre des mises à jour, il faudrait plutôt ajouter un flag sur le modèle OIDCProvider pour dire "capable de synchro-authentic" (c'est super spécifique mais au point où on en est) et un champ caché avec la date de la dernière synchro, date prise à now() - 1 minute de la dernière exécution (en cas de décalage d'horloge). D'une commande ça deviendra juste une méthode de cron dans le style passerelle (je ne sais qu'il n'y a pas le cadre pour faire ça actuellement, ce sera appelé par une commande spécifique, mais partons sur la bonne forme, un peu comme la commande sync-ldap-user ne contient quasiment pas de code).

class AppConfig:
    def hourly(self):
        last_time = now() - timedela(minutes=1)
        for provider in providers:
            provider.oidc_provider_synchro(last_time)
        provider.sync_last_time = last_time
        provider.save(fields=['sync_last_time'])
#20

Updated by Paul Marillonnet 10 months ago

Ok pour virer l’option '--delta' et se baser sur des champs spécifiques de modèles.
Par contre pour virer le code de la commande, je n’arrive pas à trouver un parallèle avec sync-ldap-users (où la méthode du backend appelée, i.e. get_users, est générique et ne se restreint pas à des fins de synchronisation). Ici à vouloir sortir le code de la commande on se retrouve avec du code très spécifique dans le modèle, spécifique car propre à la synchro, qui plus est seulement lorsque le fournisseur oidc distant est un authentic.

Un exemple de patche pour illustrer mon propos. Je pourrais encore déplacer les bouts spécifiques aux appels à /api/users/?modified_gt=… et /api/synchronization/ dans authentic2_auth_oidc.utils, mais ça va pas simplifier l’affaire déjà plutôt convoluée.

Pour ma part je préfère infiniment la première version du patche, et peut-être que j’ai mal interprété les modifications demandées dans la relecture, mais si tu me confirmes que c’est bien la piste envisagée je vais quand même continuer (en remaniant un peu les tests, et en trouver une manière de logguer correctement l’affaire, pour l’instant dans le patche c’est du bricolage).

#21

Updated by Benjamin Dauvergne 10 months ago

Paul Marillonnet a écrit :

Ok pour virer l’option '--delta' et se baser sur des champs spécifiques de modèles.
Par contre pour virer le code de la commande, je n’arrive pas à trouver un parallèle avec sync-ldap-users (où la méthode du backend appelée, i.e. get_users, est générique et ne se restreint pas à des fins de synchronisation). Ici à vouloir sortir le code de la commande on se retrouve avec du code très spécifique dans le modèle, spécifique car propre à la synchro, qui plus est seulement lorsque le fournisseur oidc distant est un authentic.

Si tu veux implémenter SCIM au passage vas y :) en attendant on aura du code spécifique à une API spécifique d'authentic dans authentic oui, on vivra avec ça.

Un exemple de patche pour illustrer mon propos. Je pourrais encore déplacer les bouts spécifiques aux appels à /api/users/?modified_gt=… et /api/synchronization/ dans authentic2_auth_oidc.utils, mais ça va pas simplifier l’affaire déjà plutôt convoluée.

Mon souci c'est d'avoir la logique dans un seul endroit et pas éparpillé dans des commandes et à terme de faire disparaître ces commandes pour avoir un système de cron unique et pas une nouvelle commande à chaque fois.

Pour ma part je préfère infiniment la première version du patche, et peut-être que j’ai mal interprété les modifications demandées dans la relecture, mais si tu me confirmes que c’est bien la piste envisagée je vais quand même continuer (en remaniant un peu les tests, et en trouver une manière de logguer correctement l’affaire, pour l’instant dans le patche c’est du bricolage).

Disons que je ne vois pas de difficulté technique à mettre le code exactement identique ailleurs que dans la commande, si tu en vois dis moi, je ne vois qu'une objection de forme sur le fait que ce soit spécifique à un cas d'usage Publik/authentic.

C'est rouge, je regarde dès que c'est vert.

#22

Updated by Paul Marillonnet 10 months ago

Benjamin Dauvergne a écrit :

[…]

Si tu veux implémenter SCIM au passage vas y :) en attendant on aura du code spécifique à une API spécifique d'authentic dans authentic oui, on vivra avec ça.

[…]

Mon souci c'est d'avoir la logique dans un seul endroit et pas éparpillé dans des commandes et à terme de faire disparaître ces commandes pour avoir un système de cron unique et pas une nouvelle commande à chaque fois.

[…]

Disons que je ne vois pas de difficulté technique à mettre le code exactement identique ailleurs que dans la commande, si tu en vois dis moi, je ne vois qu'une objection de forme sur le fait que ce soit spécifique à un cas d'usage Publik/authentic.

C'est rouge, je regarde dès que c'est vert.

Ok, donc la version avec le code dans une méthode du modèle. J’avais commencé à réfléchir à une façon dont les logs de la méthode pourraient arriver sur stdout quand celle-ci détecte qu’elle a été appelée par la commande, mais ça donne un peu n’importe quoi dans le code. Finalement une version où ce qui est dans la commande arrive sur stdout, et les logs de la méthode passent comme ailleurs dans le logging.getLogger(__name__).

#23

Updated by Benjamin Dauvergne 10 months ago

Paul Marillonnet a écrit :

Ok, donc la version avec le code dans une méthode du modèle. J’avais commencé à réfléchir à une façon dont les logs de la méthode pourraient arriver sur stdout quand celle-ci détecte qu’elle a été appelée par la commande, mais ça donne un peu n’importe quoi dans le code. Finalement une version où ce qui est dans la commande arrive sur stdout, et les logs de la méthode passent comme ailleurs dans le logging.getLogger(__name__).

Faut rien inventer pour la sortie, utilise logging partout et adapte la configuration du handler et du logger en fonction de 'verbose'. Il me semble que Valentin a fait ça dans une autre commande, à regarder.

#24

Updated by Paul Marillonnet 10 months ago

Benjamin Dauvergne a écrit :

Faut rien inventer pour la sortie, utilise logging partout et adapte la configuration du handler et du logger en fonction de 'verbose'. Il me semble que Valentin a fait ça dans une autre commande, à regarder.

Je ne retrouve pas la commande en question. Quelque chose comme ça où un argument 'verbose' est passé à la méthode en fonction des options de la commande ?

#25

Updated by Frédéric Péters 10 months ago

sync-ldap-users, log_ldap_to_console, etc.

#26

Updated by Paul Marillonnet 10 months ago

Frédéric Péters a écrit :

sync-ldap-users, log_ldap_to_console, etc.

Ah oui ok je n’avais pas compris que c’était de la mécanique de prévention de doublon dans les logs de commande de synchro ldap dont Benj parlait. Je vais proposer quelque chose qui va dans ce sens.

#27

Updated by Paul Marillonnet 10 months ago

  • Status changed from Solution proposée to En cours
#28

Updated by Paul Marillonnet 10 months ago

Voilà, plutôt que de s’inspirer un peu de ce qui a été fait dans #58404, en faire une classe parente LogToConsoleBaseCommand (0001), qu’on ré-utilise par la suite pour notre synchro OIDC (0002).

#30

Updated by Benjamin Dauvergne 8 months ago

  • Status changed from Solution proposée to Solution validée
#31

Updated by Benjamin Dauvergne 8 months ago

  • Status changed from Solution validée to En cours

Ça synchronise sur l'email et pas sur le sub, ça ne me parait ce qui est souhaitable pour un raccordement en général, je ne sais pas trop pourquoi Fred a choisi de synchroniser sur l'email (en cas de changement d'email la synchro est perdue et le service ne verra pas le changement jusqu'à la prochaine connexion).

#32

Updated by Paul Marillonnet 8 months ago

Benjamin Dauvergne a écrit :

Ça synchronise sur l'email et pas sur le sub, ça ne me parait ce qui est souhaitable pour un raccordement en général, je ne sais pas trop pourquoi Fred a choisi de synchroniser sur l'email (en cas de changement d'email la synchro est perdue et le service ne verra pas le changement jusqu'à la prochaine connexion).

Ok, je revois ça pour synchroniser sur le sub.

#34

Updated by Paul Marillonnet 7 months ago

  • Related to Development #70805: script de synchronisation : pour un client activant la gestion des profils PM, l’endpoint doit retourner les subs correspondant à ces profils added
#35

Updated by Benjamin Dauvergne 6 months ago

Paul Marillonnet a écrit :

Voilà, on se base sur le sub lorsque celui-ci est fourni.

Il faut virer complètement la synchro sur l'email, la synchro ne doit pas créer de nouvelles liaisons, du tout, ça n'apporte rien et ça nous a causé des soucis par le passé. La synchronisation n'est là que pour que les gens puissent éditer leur profil sans se préoccuper de sa propagation.

#36

Updated by Paul Marillonnet 6 months ago

  • Status changed from Solution proposée to En cours

Ok, je n’avais pas compris ça, je vire complètement toute concordance sur l’email.

#38

Updated by Benjamin Dauvergne 6 months ago

  • Status changed from Solution proposée to Solution validée

Ok. Dans le futur il faudrait factoriser la partie mapping des claims avec ce qui est fait dans le backend d'auth_oidc.

#39

Updated by Paul Marillonnet 6 months ago

  • Related to Development #72418: auth_oidc : factorisation de la résolution du mapping de claim entre le backend d’authn et la synchronisation added
#40

Updated by Paul Marillonnet 6 months ago

  • Status changed from Solution validée to Résolu (à déployer)
commit 73ac9f079a9a916fbad3524afd8a7b481c9ab22f
Author: Paul Marillonnet <pmarillonnet@entrouvert.com>
Date:   Mon May 30 17:59:15 2022 +0200

    auth_oidc: add an oidc-sync-provider command (#62710)

commit 2aeb5bad51ded7e35f4ac3feed8a6b4c7b263d8b
Author: Paul Marillonnet <pmarillonnet@entrouvert.com>
Date:   Fri Aug 5 13:05:55 2022 +0200

    management: add a LogToConsoleCommand base class (#62710)
#41

Updated by Transition automatique 6 months ago

  • Status changed from Résolu (à déployer) to Solution déployée
#42

Updated by Transition automatique 3 months ago

Automatic expiration

Also available in: Atom PDF