Récupération d'un token

Bonjour,

J’ai une GED qui s’affiche (iFrame) au chargement d’un enregistrement en vue formulaire en se basant sur le n° de société de l’enregistrement actif:

(function(ui) {
    // Is it the responsive UI ?
    if (!ui) return;
    // Ajax services with current grant, menu, texts...
    var app = ui.getAjax();
 
    Simplicite.UI.hooks.EmplFrontBoEmployers = function(o, cbk) {
    	try {
            // In the example hooks will be available on main instance only
            if (o.isMainInstance()) {
                console.log("Employers loading...");
                // object UI parameters = clone of the globals properties
                var p = o.locals.ui;
                // When object form is loaded in the container ctn
                
				o.locals.ui.form.onload = function(ctn, obj) {
					try {
						var app = $ui.getAjax(); // services, user rights, parameters...
						var noDossier = obj.getFieldValue("EmplFrontBoEmployersNoSociety_ID");
						
						if (noDossier) {
							
							/*appel d'une url pour obtenir un token
							placer le token en variable
							puis appel de la GED avec l'url en param + n°société+token*/
							
							
							var url = app.sysparams.VDL_GED_GIMMO_URL + "?NumDossier=" + noDossier//+token;
							console.log("URL calculée... : "+url);
							var iframe = $('<iframe frameborder="0" name="dossier" scrolling="yes" style="width: 900px; height: 300px; border: solid 1px gray"/>');
							$('#divdossier').html(iframe.attr("src", url));
						}
					}
					catch(ex) { 
						/* iframe not supported ? */
						app.error("Le contenu ne peut pas être affiché "+e.message);
					}
				}
        	}
    	}
				
		catch(ex) { 
			/* iframe not supported ? */
			app.error("Error in Simplicite.UI.hooks.myObject: "+e.message);
		}		 
		finally {
            // Required callback when hooks are loaded
            cbk && cbk();
        }
    };
})(window.$ui);

Pour sécuriser la connexion, on me demande maintenant d’aller sur une 1re url qui va me renvoyer un token et ensuite d’ajouter ce token à l’url de la GED.

Puis-je le faire ici juste avant l’appel de la GED?

Il suffit de faire un call ajax avec jquery. Il faudra ajouter le content type s’il n’est pas explicite et connaitre la structure de la reponse pour savoir ce que contiendra result :

$.ajax({
  url: ...
}).done(function(result) {
  // afficher Iframe...
});

Après discussion ici, la demande du token doit se faire côté serveur alors que l’affichage de la GED se fait côté client.
J’imagine donc un script java dans code partagé pour récupérer le token et il faut le passer dans la function(ui) qui affiche la page dans l’iFrame

C’est la meilleure façon de faire ou en avez-vous une autre?

Il y a plusieurs approches possibles. Par exemple coté serveur vous faite l’appel pour obtenir votre token et vous le stockez dans un paramètre utilisateur ou dans un paramètre d’objet. Il sera alors accessible au niveau du client via getParameter niveau grant (cf. https://docs.simplicite.io/4.0/jsdoc/Simplicite.Ajax.Grant.html#getParameter) ou niveau object (cf. https://docs.simplicite.io/4.0/jsdoc/Simplicite.Ajax.BusinessObject.html#getParameter)

Merci.
si je résume : au chargement du formulaire le script (RESSOURCE) s’exécute. c’est depuis ce script que je dois lancer la méthode qui va demander le token, le placer en paramètre système, et ce script appelle l’url de la GED an ajoutant le token qui est en paramètre système.

(function(ui) {
    // Is it the responsive UI ?
    if (!ui) return;
    // Ajax services with current grant, menu, texts...
    var app = ui.getAjax();
 
    Simplicite.UI.hooks.EmplFrontBoEmployers = function(o, cbk) {
    	try {
            // In the example hooks will be available on main instance only
            if (o.isMainInstance()) {
                console.log("Employers loading...");
                // object UI parameters = clone of the globals properties
                var p = o.locals.ui;
                // When object form is loaded in the container ctn
                
				o.locals.ui.form.onload = function(ctn, obj) {
					try {
						var app = $ui.getAjax(); // services, user rights, parameters...
						var noDossier = obj.getFieldValue("EmplFrontBoEmployersNoSociety_ID");
						
						if (noDossier) {
							
							//appel de la méthode EmplFrontGED
							// la méthode place le token en paramètre système
							
							var url = app.sysparams.VDL_GED_URL + "?numero=" + noDossier// + "&_token=" + variable token;
							console.log("URL calculée... : "+url);
							var iframe = $('<iframe frameborder="0" name="dossier" scrolling="yes" style="width: 900px; height: 300px; border: solid 1px gray"/>');
							$('#divdossier').html(iframe.attr("src", url));
						}
					}
					catch(ex) { 
						/* iframe not supported ? */
						app.error("Le contenu ne peut pas être affiché "+e.message);
					}
				}
        	}
    	}
				
		catch(ex) { 
			/* iframe not supported ? */
			app.error("Error in Simplicite.UI.hooks.myObject: "+e.message);
		}		 
		finally {
            // Required callback when hooks are loaded
            cbk && cbk();
        }
    };

Comment est-ce que j’appelle la méthode depuis le script?

Non ce n’est pas ce que j’ai décrit, ce que j’ai décrit c’est:

  1. coté serveur dans un hook ad hoc (ex: le initUpdate ou plus globalement le postLoad de votre objet, voire globalement dans le grant hook postLoadGrant) vous recupérez votre token (le choix du hook dépend du scope et de la durée de vie de ce token, ça c’est vous qui savez)

  2. coté serveur vous stockez la valeur du token dans un parametre système (global, niveau utilisateur ou niveau objet, là aussi c’est à vous de choisir la bonne approche en fct du scope et de la durée de vie de votre token

  3. coté client quand vous en avez besoin vous appelez la fonction getParameter soit niveau grant, soit niveau objet en fct de votre choix ci-dessus pour récupérer la valeur du token

D’abord je commence par vous souhaiter une excellente année 2020 !

Je reprends le fil après quelques vacances.

Dans mon idée j’utilise le initUpdate pour faire une demande de token à chaque affichage en vue formulaire. Je ne vois pas trop comment utiliser un paramètre système. Le paramètre système n’est-il pas chargé à l’ouverture de l’application et ne peut pas être changer sans vider le cache ou recharger l’application?

Non la valeur d’un paramètre système/utilisateur/d’objet peut être créé/changé/supprimé dynamiquement à tout moment au cours d’une session

Faites le test:

	@Override
	public void postLoad()
	{
		super.postLoad();
		setParameter("MY_TOKEN", "1234567890"); // Object parameter
		getGrant().setParameter("MY_OTHER_TOKEN", "0987654321"); // User parameter
	}

	@Override
	public String postSave()
	{
		AppLog.info(getClass(), "postSave", "My token: " + getParameter("MY_TOKEN"), getGrant());
		AppLog.info(getClass(), "postSave", "My other token: " + getGrant().getParameter("MY_OTHER_TOKEN"), getGrant());
		return super.postSave();
	}

La question que vous devez vous poser c’est où et quand récupérer votre token pour que ça soit conforme à sa logique d’utilisation, sa durée de vie, etc.

Si c’est un token de longue durée partagé par tous les users mettez le dans un paramètre système statique, s’il est de longue durée mais unique par user sa gestion doit se faire plutôt dans un grant hook et être stocké dans un paramètre utilisateur, si c’est un token éphémère à usage unique il faut le créer au plus proche de son usage par exemple dans un paramètre d’objet, etc.