Projet

Général

Profil

Development #9210

Quand l'idp contrôle les rôles les actions de workflow pour ajouter/soustraire un rôle doivent utiliser le web-service de l'IdP

Ajouté par Benjamin Dauvergne il y a plus de 8 ans. Mis à jour il y a environ 8 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
Début:
04 décembre 2015
Echéance:
30 décembre 2015
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Pour ajouter un rôle:

POST /api/user/<user.names_identifiers[0]>/<role.slug>/

renvoie toujours 201;

pour supprimer un rôle

DELETE /api/user/<user.names_identifiers[0]>/<role.slug>/

renvoie toujours 200


Fichiers

0002-misc-add-an-http_delete_request-helper-function-9210.patch (898 octets) 0002-misc-add-an-http_delete_request-helper-function-9210.patch Benjamin Dauvergne, 05 décembre 2015 23:51
0001-add-helper-method-to-test-if-user-attributes-are-IdP.patch (3,59 ko) 0001-add-helper-method-to-test-if-user-attributes-are-IdP.patch Benjamin Dauvergne, 05 décembre 2015 23:51
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (4,01 ko) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 05 décembre 2015 23:51
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (4,35 ko) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 14 décembre 2015 14:11
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (4,35 ko) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 27 décembre 2015 12:19
0001-add-helper-method-to-test-if-user-attributes-are-IdP.patch (3,61 ko) 0001-add-helper-method-to-test-if-user-attributes-are-IdP.patch Benjamin Dauvergne, 04 janvier 2016 10:32
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (4,67 ko) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 04 janvier 2016 10:32
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (4,68 ko) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 04 janvier 2016 10:43
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (4,68 ko) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 04 janvier 2016 16:55
0001-fixup-9210.patch (2,15 ko) 0001-fixup-9210.patch Frédéric Péters, 04 février 2016 16:05
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (5,09 ko) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 04 février 2016 16:11
0004-populate-wscall-secrets-in-check_hobos-9210.patch (963 octets) 0004-populate-wscall-secrets-in-check_hobos-9210.patch Benjamin Dauvergne, 04 février 2016 16:11

Demandes liées

Lié à Publik - Project management #8006: Supprimer la création de rôles dans w.c.s.Fermé03 août 201505 janvier 2016

Actions

Révisions associées

Révision 790023bd (diff)
Ajouté par Benjamin Dauvergne il y a environ 8 ans

add helper method to test if user attributes are IdP managed (#9210)

Révision 9d13b21b (diff)
Ajouté par Benjamin Dauvergne il y a environ 8 ans

misc: add an http_delete_request helper function (#9210)

Révision 6772ebef (diff)
Ajouté par Benjamin Dauvergne il y a environ 8 ans

wf/roles: handle case when user attributes are managed by the idp (#9210)

If the user's attributes are managed by an idp, we add/remove roles by calling
the idp role management web-services. It only works with authentic2.

Historique

#1

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

#3

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Testé à l'aide du workflow https://eservices-montpellier.dev.entrouvert.org/backoffice/workflows/27/status/2/, de la classe d'authentification du ticket #8896 et de la configuration suivante dans /etc/authentic2-multitenant/config.py:

# Test REST Authentication

try:
    import hobo.rest_authentication
    REST_FRAMEWORK['DEFAULT_AUTHENTICATION_CLASSES'] += ('hobo.rest_authentication.PublikAuthentication',)
except ImportError:
    print 'Unable to install PublikAuthentication'

J'ai aussi mis en dur dans la classe PublikAuthentication la clé secrète employée par w.c.s. pour signer.

L'ajout/retrait du rôle "Alex Jany" au soumissionnaire du formulaire fonctionne, avec propagation jusqu'à w.c.s. dans les secondes qui suivent.

Le patch numéro 3 a été mis à jour avec la signature des URLs qui manquait.

#4

Mis à jour par Frédéric Péters il y a plus de 8 ans

s/is_idp_manage_user_attributes/is_idp_managing_user_attributes/ (ou does_idp_manage_user_attributes mais j'aime moins).

Même quand c'est le cas, on ne perdrait rien à quand même exécuter le code local.

#5

Mis à jour par Frédéric Péters il y a plus de 8 ans

Et peut-être même alors taper les appels HTTP en afterjob, pour ne pas perdre de temps.

#6

Mis à jour par Thomas Noël il y a plus de 8 ans

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

Même quand c'est le cas, on ne perdrait rien à quand même exécuter le code local.

On gagnerait beaucoup (c'est instantané, si la présence du rôle est nécessaire aussitôt). En fait, il faut absolument le faire.

#7

Mis à jour par Thomas Noël il y a plus de 8 ans

  • Echéance mis à 30 décembre 2015
  • Statut changé de Nouveau à Information nécessaire
  • Priorité changé de Normal à Haut

J'augmente la priorité parce que c'est une fonctionnalité nécessaire dans les workflows d'Alfortville.

(Je laisse non assigné cependant)

#8

Mis à jour par Thomas Noël il y a plus de 8 ans

  • Statut changé de Information nécessaire à En cours
#9

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

J'ai pris en compte la remarque de Thomas concernant l’inconditionnalité de l'action locale.

Le diff entre l'ancien patch numéro 3 et le nouveau:

diff --git a/wcs/wf/roles.py b/wcs/wf/roles.py
index 4834fb9..0a5e200 100644
--- a/wcs/wf/roles.py
+++ b/wcs/wf/roles.py
@@ -76,10 +76,9 @@ class AddRoleWorkflowStatusItem(WorkflowStatusItem):
             # we can't work on anonymous or user_hash'ed forms
             return
         user = get_publisher().user_class.get(formdata.user_id)
+        self.perform_local(user, formdata)
         if user.name_identifiers and is_idp_manage_user_attributes():
             self.perform_idp(user, formdata)
-        else:
-            self.perform_local(user, formdata)

     def perform_local(self, user, formdata):
         if not user.roles:

#10

Mis à jour par Thomas Noël il y a plus de 8 ans

A priori tu as posté l'ancien patch. Sur le nouveau, il faut penser à laisser l'action locale sur le Remove aussi. Avec ça, c'est ack pour moi. (je laisse la main à Fred pour insister sur le s/is_idp_manage_user_attributes/is_idp_managing_user_attributes/ le cas échéant)

#11

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

J'ai pris en compte la remarque de Fred sur le renommage et le after_job et aussi l'action locale (et oui j'avais posté le mauvais patch).

#12

Mis à jour par Frédéric Péters il y a plus de 8 ans

Dans 0003, c'est resté is_idp_manage_user_attributes.

#14

Mis à jour par Thomas Noël il y a plus de 8 ans

Fallait pas prendre de congés.

Et donc, Ack pour moi.

#15

Mis à jour par Frédéric Péters il y a plus de 8 ans

Exception:
  type = '<type 'exceptions.AttributeError'>', value = ''module' object has no attribute 'urlquote''

Stack trace (most recent call first):
  File "/home/fred/src/eo/wcs/wcs/wf/roles.py", line 33, in roles_ws_url
    31     entity_id = idps.values()[0]['metadata']
    32     base_url = entity_id.split('idp/saml2/metadata')[0]
>   33     return urlparse.urljoin(base_url, '/api/roles/%s/members/%s/' % (urllib.urlquote(role_uuid),
    34                                                                      urllib.urlquote(user_uuid)))
    35 

Et après ça il yaura le fait que "idps.values()[0]['metadata']" donne le nom du fichier avec les métadata, et pas les métadata.

Peut-être dès lors, pour ne pas creuser trop dans le SAML, simplement avoir un "Role Webservice URL", à l'instar du Registration URL (dans /settings/identification/idp/identities). (?)

#16

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

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

[...]

C'est corrigé depuis le patch du 14 décembre.

Et après ça il yaura le fait que "idps.values()[0]['metadata']" donne le nom du fichier avec les métadata, et pas les métadata.

Idem.

Je pense que tu as testé un vieux patch, le code actuel ressemble à cela:

    entity_id = idps.values()[0]['metadata_url']
    base_url = entity_id.split('idp/saml2/metadata')[0]
    url = urlparse.urljoin(base_url, '/api/roles/%s/members/%s/' % (urllib.quote(role_uuid),
                                                                     urllib.quote(user_uuid)))

#17

Mis à jour par Frédéric Péters il y a plus de 8 ans

En effet j'avais appliqué par mégarde un vieux patch.

Cela étant :

Exception:
  type = '<type 'exceptions.AttributeError'>', value = ''NoneType' object has no attribute 'get_server''

Stack trace (most recent call first):
  File "/home/fred/src/eo/wcs/wcs/wf/roles.py", line 43, in roles_ws_url
    41                                                                      urllib.quote(user_uuid)))
    42     secret = get_secret(url)
>   43     orig = get_request().get_server().split(':')[0]
    44     url += '?orig=%s' % orig
    45     return sign_url(url, secret)

Et je n'aime guère le entity_id.split('idp/saml2/metadata')[0] (le "Registration URL" avait été créé pour ne pas dépendre des URL d'Authentic 2); mais je laisserai passer.

#18

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

J'ai sorti la construction de l'URL du after_job. Ne pas dépendre des URLs d'authentic2 ? Dans l'hypothèse ou quelqu'un serait ok pour implémenter le même web-service avec le même protocole de signature dans un autre logiciel qu'authentic2... si ça arrive on changera le code.

#19

Mis à jour par Frédéric Péters il y a plus de 8 ans

J'imagine maintenant une dépendance à #8896, non ?

[04/Jan/2016 18:48:06] "POST /api/roles/d100b3f981ef409f8a56d410e8573aeb/members/fred/?orig=auquo&algo=sha256&timestamp=2016-01-04T17%3A48%3A06Z&nonce=3e2603f2cc9e4cd44fe765b722ff438c&signature=6UNsPjsJtOrkKvLm/TyT1kOTcxgCxlyAeVK3UTqgfqU%3D HTTP/1.1" 401 58
#20

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Oui, j'avais le secret espoir que #8896 soit intégré bien avant celui-ci :)

#21

Mis à jour par Thomas Noël il y a environ 8 ans

  • Version cible mis à v1.32
#22

Mis à jour par Frédéric Péters il y a environ 8 ans

Pour le moment ça signe la requête vers authentic avec une clé tirée de [api-secrets]; afin que les choses soient claires, [api-secrets] devrait uniquement être utilisé pour la vérification des requêtes s'adressant à l'API de w.c.s.

Pour ça je propose d'intégrer le patch suivant dans le 0003; et puis derrière il faudra adapter le hobo_deploy pour créer et remplir la section [wscall-secrets].

#23

Mis à jour par Benjamin Dauvergne il y a environ 8 ans

Manque le patch.

#26

Mis à jour par Frédéric Péters il y a environ 8 ans

Ça marche pour moi.

#27

Mis à jour par Frédéric Péters il y a environ 8 ans

(cela étant je préfère qu'on attende que l'authentic avec l'authent rest framework publik se trouve en prod)

#28

Mis à jour par Thomas Noël il y a environ 8 ans

  • Version cible v1.32 supprimé
#30

Mis à jour par Thomas Noël il y a environ 8 ans

  • Version cible mis à v1.33
#31

Mis à jour par Thomas Noël il y a environ 8 ans

  • Version cible changé de v1.33 à v1.34
#32

Mis à jour par Thomas Noël il y a environ 8 ans

  • Version cible changé de v1.34 à v1.35
#33

Mis à jour par Benjamin Dauvergne il y a environ 8 ans

Voilà l'authentification REST_FRAMEWORK est en prod:

In [1]: from django.conf import settings

In [2]: settings.REST_FRAMEWORK
Out[2]: 
{'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.BasicAuthentication',
  'rest_framework.authentication.SessionAuthentication',
  'hobo.rest_authentication.PublikAuthentication'),
 'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',
  'rest_framework.filters.OrderingFilter'),
 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated',),
 'NON_FIELD_ERRORS_KEY': '__all__',
 'PAGE_SIZE': 10}

Je pousse ?

#34

Mis à jour par Frédéric Péters il y a environ 8 ans

Yep, c'est ok pour moi.

#35

Mis à jour par Thomas Noël il y a environ 8 ans

  • Statut changé de En cours à Résolu (à déployer)
  • Assigné à mis à Benjamin Dauvergne
  • Priorité changé de Haut à Normal
commit 6772ebef00c10b135111188b14a38b53b2cbe075
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Sat Dec 5 23:47:17 2015 +0100

    wf/roles: handle case when user attributes are managed by the idp (#9210)

    If the user's attributes are managed by an idp, we add/remove roles by calling
    the idp role management web-services. It only works with authentic2.

commit 9d13b21b69b7b515125e7494baefb22c8fe031d1
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Sat Dec 5 23:33:53 2015 +0100

    misc: add an http_delete_request helper function (#9210)

commit 790023bd1190aa3478e748ff70917743d1e4677c
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Fri Dec 4 17:35:47 2015 +0100

    add helper method to test if user attributes are IdP managed (#9210)

#36

Mis à jour par Thomas Noël il y a environ 8 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF