Création automatique d'un nouvel utilisateur si le provider du token Oauth2 fourni est 'renault'

Bonjour,

nous avons besoin de pouvoir initialiser les comptes et habilitations de nos nouveaux utilisateurs automatiquement lors de leur première connexion via une session UI ou API si un token Oauth2 / provider “renault” est fourni.

Afin d’obtenir ce comportement, j’ai d’abord implémenté le hook PlatformHooks.preLoadGrant(g) mais à ce stade, les informations de la session (et du provider) ne sont pas initialisées.

J’ai donc déplacé mon code dans le hook PlatformHooks.parseAuth(sys,info) où le provider est bien initialisé mais si ça fonctionne comme attendu lors de l’ouverture de session UI, lors de l’ouverture de session API, ce code n’est pas exécuté.

Nous avons communiqué sur un contournement consistant à se connecter une première fois via la UI mais nous souhaitons rendre cette activation transparente pour les utilisateurs de nos outils front consommant nos API.

Y-a-t-il une solution standard ou bien cela nécessite-t-il une évolution du coté de Simplicité ?

Merci beaucoup pour votre support.

[EDIT] voici le code du parseAuth:

public String parseAuth(Grant sys, com.simplicite.util.SessionInfo info) {
		if (info.getProvider().equals("renault")) {
			synchronized (sys) {
				if (Tool.isEmpty(Grant.getUserId(info.getLogin()))) {
					try {
						ObjectDB o = sys.getTmpObject("User");
						BusinessObjectTool ot = o.getTool();
						ot.getForCreate();
						o.setFieldValue("usr_login",info.getLogin());
						o.setFieldValue("usr_active",1);
						ot.validateAndSave();
						AppLog.warning("[IN parseAuth] Created new user for login '"+info.getLogin()+"'", null, sys);
					} catch(Exception e) {
						AppLog.error("[IN parseAuth] Error creating new user for login '"+info.getLogin()+"'", e, sys);
					}
				}
			}
		}
        return info.getLogin();
    }

Je vais regarder ce cas de plus près, le besoin de provisionning auto d’utilisateur lors d’un appel API n’a pas été rencontré jusqu’ici

Le bon pattren pour le provisionning reste le preLoadGrant(g). Le grant qui lui est passé en argument est minimal à ce stade mais il permet quand même de récupérer le login g.getLogin() et les infos de session g.getSessionInfo() (crées lors de la séquence d’authent). Mais bon là aussi à voir ce qui se passe dans le cas d’un appel API uniquement.

PS: Le parseAuth permet de mapper le login issu de l’autnetification sur un login de user Simplicité, ce n’est pas le bon endroit pour le provisionning.

Merci beaucoup pour ton retour rapide.

Oui, absolument :slight_smile: c’était d’ailleurs ma première approche. Si je peux accéder aux informations du token dans le preLoadGrant, tout ira bien.

Je viens de retester et en effet, le provider est bien accessible depuis le preLoadGrant lors de l’ouverture d’une session UI mais getSessionInfo() renvoie null lors de l’ouverture d’une session API.

Traces ouverture session UI / user existe

2021-08-25 12:30:16,498 INFO [com.simplicite.util.Grant] SIMPLICITE|http://6a8e5544aeb1:8080||ICORED0001|awbca01|com.simplicite.util.Grant|init||Info: awbca01 connected, session ID: F865B8CCAC128E491EC8AAF687DDC722, timeout: 30 min , user agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
2021-08-25 12:30:16,376 WARN [com.simplicite.commons.IT4itGuest_RFI.PlatformHooks] SIMPLICITE|http://6a8e5544aeb1:8080||WARN|system|com.simplicite.commons.IT4itGuest_RFI.PlatformHooks|preLoadGrant||Event: [IN preLoadGrant] Trace preLoadGrant for login 'awbca01' provider=renault

Traces ouverture session API / user existe

2021-08-25 12:27:08,727 INFO [com.simplicite.util.Grant] SIMPLICITE|http://6a8e5544aeb1:8080||ICORED0001|awbca01|com.simplicite.util.Grant|init||Info: awbca01 connected, session ID: CB998781C2254F9507AC7D4B0BF7D923, timeout: 35791394 min , user agent: curl/7.58.0
2021-08-25 12:27:08,603 ERROR [com.simplicite.util.GrantHooks] SIMPLICITE|http://6a8e5544aeb1:8080||ERROR|system|com.simplicite.util.GrantHooks|preLoadGrant||Event: Unable to create default rights for awbca01 (Cannot invoke "com.simplicite.util.SessionInfo.getProvider()" because the return value of "com.simplicite.util.Grant.getSessionInfo()" is null)
    java.lang.NullPointerException: Cannot invoke "com.simplicite.util.SessionInfo.getProvider()" because the return value of "com.simplicite.util.Grant.getSessionInfo()" is null
     at com.simplicite.commons.IT4itGuest_RFI.PlatformHooks.preLoadGrant(PlatformHooks.java:35)

Traces ouverture session UI / user n’existe pas

2021-08-25 12:47:06,667 INFO [com.simplicite.util.Grant] SIMPLICITE|http://6a8e5544aeb1:8080||ICORED0001|awbca01|com.simplicite.util.Grant|init||Info: awbca01 connected, session ID: 66F83AC55E77651C9422B51785191212, timeout: 30 min , user agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
2021-08-25 12:47:06,517 WARN [com.simplicite.commons.IT4itGuest_RFI.PlatformHooks] SIMPLICITE|http://6a8e5544aeb1:8080||WARN|system|com.simplicite.commons.IT4itGuest_RFI.PlatformHooks|preLoadGrant||Event: [IN preLoadGrant] Trace preLoadGrant for login 'awbca01' provider=renault
2021-08-25 12:47:06,402 INFO [com.simplicite.util.GrantHooks] SIMPLICITE|http://6a8e5544aeb1:8080||INFO|system|com.simplicite.util.GrantHooks|preLoadGrant||Event: Updated home page to for user 46
2021-08-25 12:47:06,380 INFO [com.simplicite.util.GrantHooks] SIMPLICITE|http://6a8e5544aeb1:8080||INFO|system|com.simplicite.util.GrantHooks|preLoadGrant||Event: Created responsibility on group 70 for user 46
2021-08-25 12:47:06,332 WARN [com.simplicite.commons.IT4itGuest_RFI.PlatformHooks] SIMPLICITE|http://6a8e5544aeb1:8080||WARN|system|com.simplicite.commons.IT4itGuest_RFI.PlatformHooks|preLoadGrant||Event: [IN preLoadGrant] Created new user for login 'awbca01'
2021-08-25 12:47:06,270 WARN [com.simplicite.commons.IT4itGuest_RFI.PlatformHooks] SIMPLICITE|http://6a8e5544aeb1:8080||WARN|system|com.simplicite.commons.IT4itGuest_RFI.PlatformHooks|preLoadGrant||Event: [IN preLoadGrant] Trace preLoadGrant for login 'awbca01' provider=renault

Traces ouverture session API / user n’existe pas

2021-08-25 12:40:40,184 ERROR [com.simplicite.webapp.servlets.api.RESTServlet] SIMPLICITE|http://6a8e5544aeb1:8080||ERROR|system|com.simplicite.webapp.servlets.api.RESTServlet|getWebServicesFactory||Event: Authentication error: Invalid token
2021-08-25 12:40:40,183 WARN [com.simplicite.webapp.tools.ServletTool] SIMPLICITE|http://6a8e5544aeb1:8080||WCORED0001|system|com.simplicite.webapp.tools.ServletTool|getAPIGrant||Warning: Unable to create user token for login awbca01
    com.simplicite.util.exceptions.ValidateException: ERR_REQUIRED: User
     at com.simplicite.util.tools.BusinessObjectTool.validate(BusinessObjectTool.java:611)
     at com.simplicite.util.tools.BusinessObjectTool.validateAndCreate(BusinessObjectTool.java:792)
     at com.simplicite.objects.System.UserToken.createToken(UserToken.java:131)
     at com.simplicite.objects.System.UserToken.createTokenForLogin(UserToken.java:92)
     at com.simplicite.webapp.tools.ServletTool.getAPIGrant(ServletTool.java:2411)

Oui il doit y avoir une subtilité dans la manière dont se charge le grant API dans le cas d’une authent externe. Je regarde et je te tiens au courant

Tu peux me rappeler comment est configurée votre authent API externe, j’avoue ne plus bien me rappeler comment ça marche dans votre cas.

Merci de me confirmer aussi la version Simplicité dont on parle.

Il s’agit de la nouvelle V5 (j’avance comme je peux de ce côté et l’été est propice à ce travail de fond).

L’authent API s’appuie sur la (re)validation (via une url oauth_provider/tokeninfo ou userinfo) d’un token fourni lors du call (idem que le token obtenu via le flow Oauth2 a priori). Si le token est validé, une session est ouverte pour le user associé au login extrait du token.

Par “nouvelle” V5 tu veux dire la release actuelle 5.0 (en révision 5.0.63) ou de la 5.1 RC (annoncée pour devenir la release au 1er sept) ?

Vu la bande passante que je peux mobiliser sur ce sujet, je vais suivre le train et je débarquerai probablement à quai avec la 5.2 ou la 5.3 ;)… Disons que j’upgraderai sur la 5.1 ou + (pour BCSI)…

Par contre, ce besoin est aussi porté par les autres instances qui sont encore en 5.0 et dont je ne maîtrise pas le planning d’upgrade. Pour ces instances, on a un contournement (demander à cliquer sur un lien pour se connecter une première fois avant de pouvoir utiliser via les API) donc si ce n’est pas backporté en 5.0, ce ne sera pas bloquant.

De toute façon, la version mineure 5.0 vit ses derniers jours, dès le 1er sept on basculera en version mineure 5.1.

Le code qui concerne l’ident/authent API n’a pas changé entre 5.0 et 5.1 si ce n’est qu’on y gère un mode à base de tokens JWT, ce qui apporte un niveau de combinatoire additionnel (en 5.1 on reste par défaut sur le mode dummy tokens de la 5.0 mais en 5.2 on changera ce mode par défaut à JWT, tout en conservant la possibilité de revenir sur le mode dummy tokens, celui ci disparaissant définitivement en 5.3)

Bref, vos tokens sont ils des tokens JWT ?

Oui absolument, avec header (algorythm & token type) et payload data (avec potentiellement des profiles de droits administrés dans l’annuaire central qu’on synchronisera avec les groupes du modèle interne quand j’aurai le temps de m’en occuper).

OK il faudra explorer de ce coté quand la 5.1 sera releasée.

Pour le moment la gestion des tokens JWT est, de mémoire, limitée aux tokens issus de Simplicité, mais on pourra alors voir comment étendre ça aux tokens externes.

J’ai fait en 5.1 (et 5.2) une modif qui permet d’avoir le session info dans les pre/postLoadGrant dans le cas de l’ident/authent API, ça devrait aussi le faire dans ton cas particulier de token externe, à vérifier.

NB: Je n’ai pas creusé le cas de l’appel parseAuth dans ce cas, car ce n’est de toute façon pas le bon endroit pour créer des users.

Je te suggère de faire tes tests v5 directement en 5.1 (images 5-beta) car de toute façon la 5.0 est en toute fin de vie (ce n’est pas une version maintenue - comme la 4.0 - c’est une version mineure qui remplace la version mineure précédente) et la 5.1 apporte de nombreuses améliorations.

1 Like

Super, merci beaucoup. Oui, je vise la 5.1 :hot_face:

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.