Project

General

Profile

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

Added by Benjamin Dauvergne about 7 years ago. Updated over 6 years ago.

Status:
Fermé
Priority:
Normal
Target version:
Start date:
04 December 2015
Due date:
30 December 2015
% Done:

0%

Estimated time:
Patch proposed:
Yes
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


Files

0002-misc-add-an-http_delete_request-helper-function-9210.patch (898 Bytes) 0002-misc-add-an-http_delete_request-helper-function-9210.patch Benjamin Dauvergne, 05 December 2015 11:51 PM
0001-add-helper-method-to-test-if-user-attributes-are-IdP.patch (3.59 KB) 0001-add-helper-method-to-test-if-user-attributes-are-IdP.patch Benjamin Dauvergne, 05 December 2015 11:51 PM
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (4.01 KB) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 05 December 2015 11:51 PM
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (4.35 KB) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 14 December 2015 02:11 PM
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (4.35 KB) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 27 December 2015 12:19 PM
0001-add-helper-method-to-test-if-user-attributes-are-IdP.patch (3.61 KB) 0001-add-helper-method-to-test-if-user-attributes-are-IdP.patch Benjamin Dauvergne, 04 January 2016 10:32 AM
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (4.67 KB) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 04 January 2016 10:32 AM
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (4.68 KB) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 04 January 2016 10:43 AM
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (4.68 KB) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 04 January 2016 04:55 PM
0001-fixup-9210.patch (2.15 KB) 0001-fixup-9210.patch Frédéric Péters, 04 February 2016 04:05 PM
0003-wf-roles-handle-case-when-user-attributes-are-manage.patch (5.09 KB) 0003-wf-roles-handle-case-when-user-attributes-are-manage.patch Benjamin Dauvergne, 04 February 2016 04:11 PM
0004-populate-wscall-secrets-in-check_hobos-9210.patch (963 Bytes) 0004-populate-wscall-secrets-in-check_hobos-9210.patch Benjamin Dauvergne, 04 February 2016 04:11 PM

Related issues

Related to Publik - Project management #8006: Supprimer la création de rôles dans w.c.s.Fermé03 August 201505 January 2016

Actions

Associated revisions

Revision 790023bd (diff)
Added by Benjamin Dauvergne almost 7 years ago

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

Revision 9d13b21b (diff)
Added by Benjamin Dauvergne almost 7 years ago

misc: add an http_delete_request helper function (#9210)

Revision 6772ebef (diff)
Added by Benjamin Dauvergne almost 7 years ago

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.

History

#1

Updated by Benjamin Dauvergne about 7 years ago

#3

Updated by Benjamin Dauvergne almost 7 years ago

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

Updated by Frédéric Péters almost 7 years ago

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

Updated by Frédéric Péters almost 7 years ago

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

#6

Updated by Thomas Noël almost 7 years ago

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

Updated by Thomas Noël almost 7 years ago

  • Due date set to 30 December 2015
  • Status changed from Nouveau to Information nécessaire
  • Priority changed from Normal to Haut

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

(Je laisse non assigné cependant)

#8

Updated by Thomas Noël almost 7 years ago

  • Status changed from Information nécessaire to En cours
#9

Updated by Benjamin Dauvergne almost 7 years ago

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

Updated by Thomas Noël almost 7 years ago

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)

#12

Updated by Frédéric Péters almost 7 years ago

Dans 0003, c'est resté is_idp_manage_user_attributes.

#14

Updated by Thomas Noël almost 7 years ago

Fallait pas prendre de congés.

Et donc, Ack pour moi.

#15

Updated by Frédéric Péters almost 7 years ago

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

Updated by Benjamin Dauvergne almost 7 years ago

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

Updated by Frédéric Péters almost 7 years ago

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

Updated by Benjamin Dauvergne almost 7 years ago

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

Updated by Frédéric Péters almost 7 years ago

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

Updated by Benjamin Dauvergne almost 7 years ago

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

#21

Updated by Thomas Noël almost 7 years ago

  • Target version set to v1.32
#22

Updated by Frédéric Péters almost 7 years ago

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

Updated by Benjamin Dauvergne almost 7 years ago

Manque le patch.

#26

Updated by Frédéric Péters almost 7 years ago

Ça marche pour moi.

#27

Updated by Frédéric Péters almost 7 years ago

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

#28

Updated by Thomas Noël almost 7 years ago

  • Target version deleted (v1.32)
#30

Updated by Thomas Noël almost 7 years ago

  • Target version set to v1.33
#31

Updated by Thomas Noël almost 7 years ago

  • Target version changed from v1.33 to v1.34
#32

Updated by Thomas Noël almost 7 years ago

  • Target version changed from v1.34 to v1.35
#33

Updated by Benjamin Dauvergne almost 7 years ago

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

Updated by Frédéric Péters almost 7 years ago

Yep, c'est ok pour moi.

#35

Updated by Thomas Noël almost 7 years ago

  • Status changed from En cours to Résolu (à déployer)
  • Assignee set to Benjamin Dauvergne
  • Priority changed from Haut to 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

Updated by Thomas Noël over 6 years ago

  • Status changed from Résolu (à déployer) to Fermé

Also available in: Atom PDF