Activer la signature électronique pour Portail de services

  • Rversion finale: Zurich
  • Mis à jour 31 juil. 2025
  • 5 minutes de lecture
  • Vous pouvez configurer la signature électronique dans Portail de services pour exiger une nouvelle authentification des utilisateurs approbateurs.

    Avant de commencer

    La com.snc.integration.esig.window propriété système est prise en charge pour activer la connexion SSO dans une nouvelle fenêtre.

    Rôle requis : admin

    Procédure

    1. Activez le module d’extension Approbations avec signature électronique [com.glide.e_signature_approvals].
    2. Accédez à la Définition du système > Registre de signatures électroniques.
    3. Ajoutez à la liste toutes les tables pour lesquelles vous souhaitez exiger une signature électronique.

    Résultats

    Lorsque la signature électronique est activée, les approbateurs doivent fournir un mot de passe pour approuver ou rejeter toute demande. L’authentification avec Touch ID fonctionne dans l’application mobile. Sur le Web mobile, les approbateurs doivent toujours saisir un mot de passe. Pour plus d’informations sur la configuration des signatures électroniques, reportez-vous à la section Approval with e-signature.

    Activer la connexion SSO dans une nouvelle fenêtre

    Ouvre une nouvelle fenêtre pour l’authentification SSO lors de l’utilisation de la signature électronique pour les approbations.

    Avant de commencer

    La connexion SAML (Security Assertion Markup Language) n’est prise en charge que sur le bureau Portail de services.

    Pour plus d’informations, consultez l’article de la base de connaissances sur la connexion SSO avec signature électronique.

    Rôle requis : admin

    Procédure

    1. Entrez le script spEsignatureCustom.
      1. Entrez sys_ui_script.list dans le navigateur de filtre.
      2. Sélectionnez Nouveau et créez un nouveau script d’interface utilisateur.
      3. Dans le formulaire Script d’interface utilisateur, saisissez spEsignatureCustom dans le champ Nom de l’API.
      4. Dans le champ Type d’interface utilisateur, sélectionnez Mobile/Portail de services.
      5. Collez le script spEsignatureCustom dans le champ Script .
      6. Sélectionnez Soumettre.
    2. Entrez le script spAuthCustom.
      1. Dans la même table sys_ui_script.list , créez un autre script d’interface utilisateur en sélectionnant Nouveau.
      2. Dans le formulaire Script d’interface utilisateur, saisissez spAuthCustom dans le champ Nom de l’API.
      3. Dans le champ Type d’interface utilisateur, sélectionnez Mobile/Portail de services.
      4. Collez le script spAuthCustom dans le champ Script .
      5. Sélectionnez Soumettre.
    3. Associez les scripts d’interface utilisateur à l’enregistrement JS Include.
      1. Accédez à la Portail de services > Portails.
      2. Identifiez le portail de services auquel vous souhaitez appliquer la prise en charge des signatures électroniques et sélectionnez le thème.
      3. Dans les listes connexes, sélectionnez Includes JS.
      4. Sélectionnez Nouveau.
      5. Remplissez les champs du formulaire.
        Tableau 1. Formulaire d’inclusion JS
        Champ Description
        Nom complet Nom de votre JS Include. Entrez spEsignatureCustom et associez l’enregistrement au script d’interface utilisateur spEsignatureCustom que vous avez créé, ou saisissez spAuthCustom et associez l’enregistrement à spAuthCustom que vous avez créé.
        Source Source pour votre enregistrement JS Include. Sélectionnez le script d’interface utilisateur.
        Script d'interface utilisateur Source du script d’interface utilisateur pour votre enregistrement JS Include. Sélectionnez spEsignatureCustom ou spAuthCustom en fonction de l’enregistrement que vous créez.
        Application Application pour votre enregistrement JS Include. L'application par défaut est Global.
        Mis à jour Champ affichant la date de dernière mise à jour de l’enregistrement.
        Package Champ qui établit le package JS Include.
      6. Sélectionnez Soumettre.

    Résultats

    Une nouvelle fenêtre s’ouvre lorsque vous utilisez la signature électronique pour les approbations.

    spEsignatureScript personnalisé

    Collez le script spEsignatureCustom dans le champ de script sys_ui_script.list.

    angular.module('sn.$sp').provider('spEsignature', function() {
    	'use strict';
    
    	this.$get = function spEsignature($q, $http, $window, urlTools, xmlUtil) {
    		var w = window;
    		var esignOW;
    		var windowWidth;
    		var windowHeight;
    		var redirectURL;
    
    		function isWindowChosen() {
    			var postParams = {
    				sysparm_scope: 'global',
    				sysparm_processor: 'ESignatureAuthUtils',
    				sysparm_name: 'isWindowChosen'
    			};
    			return $http({
    				method: 'POST',
    				url: '/xmlhttp.do',
    				data: urlTools.encodeURIParameters(postParams),
    				headers: {
    					'Content-Type': 'application/x-www-form-urlencoded'
    				},
    				transformResponse: function(response) {
    					return xmlUtil.getDataFromXml(response);
    				}
    			}).then(
    				function(response) {
    					var data = response.data ? response.data[0] : {};
    					return data.answer ===  'true'
    				},
    				function(response) {
    					// Handling failure case.
    					switch (response.status) {
    						default:
    						case 404:
    							return false;
    					}
    				});
    		}
    
    		function initiateEsignature() {
    			var postParams = {
    				sysparm_scope: 'global',
    				sysparm_processor: 'ESignatureAuthUtils',
    				sysparm_name: 'fetchAuthDetails'
    			}
    			return $http({
    				method: 'POST',
    				url: '/xmlhttp.do',
    				data: urlTools.encodeURIParameters(postParams),
    				headers: {
    					'Content-Type': 'application/x-www-form-urlencoded'
    				},
    				transformResponse: function(response) {
    					return xmlUtil.getDataFromXml(response, 'result');
    				}
    			}).then(
    				function(response) {
    					var data = response.data ? response.data[0] : {};
    					process(data);
    				});
    		}
    
    		function process(data) {
    			var shouldLogoutFirst = data.logoutFirst === 'true';
    			w['windowHeight'] = data.popup_window_height;
    			w['windowWidth'] = data.popup_window_width;
    			w['redirectURL'] = data.loginURL;
    			if (shouldLogoutFirst)
    				openEsignatureWindow(data.logoutURL);
    			else
    				authenticate();
    		}
    
    		function openEsignatureWindow(url) {
    			w['esignOW'] = window.open(url, 'esignatureAuthentication',
    				'height='+w['windowHeight']+',width='+w['windowWidth']+',top=100,left=100,toolbar=0,location=0,menubar=0');
    		}
    
    		w['authenticate'] = function(){
    			if(w['redirectURL']){
    				if(w['esignOW']) //when we signed out previously, a window is already opened. reuse it.
    					w['esignOW'].location.href = w['redirectURL'];
    				else
    					openEsignatureWindow(w['redirectURL']);
    			}
    		};
    
    		w['evaluateRedirect'] = function(msg) {
    			w['esignOW'].close();
    			if (msg == "saml2 login complete") {
    				$window.onReauthenticationComplete(msg);
    			}
    		};
    
    		return {
    			isWindowChosen: isWindowChosen,
    			initiateEsignature: initiateEsignature
    		};
    
    	};
    });
    

    spAuthScript personnalisé

    Collez le script spAuthCustom dans le champ de script sys_ui_script.list.

    angular.module('sn.$sp').factory('spAuthModal', function($q, spModal, i18n, $http, spAuthentication, glideUserSession, cabrillo, $cookies, $window, spUtil, $uibModal, spEsignature) {
    	"use strict";
    
    	function _showAuthenticationModal(requestParams, username, userSysId) {
    		var currentUser;
    		var deferred = $q.defer();
    		glideUserSession.loadCurrentUser({reload: true}).then(function(user) {
    			if (!user) {
    				deferred.reject({
    					error: {
    						status: 'ANONYMOUS',
    						message: i18n.getMessage('Not logged in')
    					}
    				});
    				return;
    			}
    			currentUser = user;
    			var serializedUser = {
    				sysId: currentUser.userID,
    				userName: currentUser.userName,
    				firstName: currentUser.firstName,
    				lastName: currentUser.lastName
    			};
    
    			// hand off to native clients
    			if (cabrillo.isNative()) {
    				cabrillo.auth.reauthenticate(currentUser).then(function() {
    					deferred.resolve(serializedUser);
    				}, function(error) {
    					if (error && error.status) {
    						deferred.reject({
    							error: error
    						});
    					}
    					//TODO: Handle rejection a little more gracefully
    					deferred.reject();
    				});
    				return;
    			}
    
    			var loginMethod = currentUser.$private.loginMethod;
    			if (!loginMethod) {
    				// As we were unable to determine the login method via the HTTP session, trying to get glide_sso_id cookie which is set in case of multisso login
    				var providerSysId = $cookies.get('glide_sso_id');
    				loginMethod = providerSysId ? 'multisso' : 'db';
    			}
    
    			if (loginMethod === 'saml' || loginMethod === 'oidc' || loginMethod === 'multisso') {
    				spEsignature.isWindowChosen().then(function(result) {
    					var modal;
    					if (!spUtil.isMobile() && loginMethod !== 'oidc' && result === true) {
    						// If enabled, Opening a new window for desktop saml login
    						spEsignature.initiateEsignature();
    					} else {
    						glideUserSession.getSsoReauthenticationUrl().then(function(url) {
    							requestParams.externalLoginURL = url;
    							openExternalAuthModal(requestParams).then(function(m) {
    								modal = m;
    							});
    						});
    					}
    					$window.onReauthenticationComplete = function(result) {
    						deferred.resolve(serializedUser);
    						if (modal)
    							modal.close();
    					};
    				});
    			} else {
    				spModal.open({
    					title:i18n.getMessage("Approver authentication"),
    					message:i18n.getMessage("Additional authentication is required, enter your usename and password to continue."),
    					footerStyle: {border: 'none', 'padding-top': 0},
    					widget: 'simpleloginui',
    					widgetInput: {},
    					shared: requestParams,
    					onSubmit: function() {
    						return onLoginModalSubmit(requestParams, username);
    					}
    				}).then(function(confirm) {
    					if (confirm.label == i18n.getMessage("OK")) {
    						deferred.resolve(serializedUser);
    					} else {
    						deferred.reject();
    					}
    				});
    			}
    		});
    
    		return deferred.promise;
    	}
    
    	function onLoginModalSubmit(requestParams, username) {
    		//(1) call login service to verify auth
    		//(2) verify same user
    		return $q(function(resolve, reject) {
    			var errorMessage = null;
    
    			if(!requestParams.username || requestParams.username.trim() === "" ||
    					!requestParams.password || requestParams.password.trim() === "") {
    				errorMessage = i18n.getMessage("User name or password invalid");
    			} else if(requestParams.username !== username) {
    				errorMessage = i18n.getMessage("Attempted to authenticate as a different user");
    			}
    
    			if(!errorMessage || errorMessage === "") {
    				spAuthentication.validateCreds(requestParams.username, requestParams.password).then(function(res) {
    					resolve({status: res.success, errorMessage: res.message});
    				});
    			} else {
    				resolve({status: !errorMessage || errorMessage === "", errorMessage: errorMessage});
    			}
    		});
    
    	}
    
    	function openExternalAuthModal(requestParams) {
    		var deferred = $q.defer();
    
    		var options = {
    			title: i18n.getMessage("Approver authentication"),
    			message: '',
    			messageOnly: false,
    			errorMessage: '',
    			input: false,
    			label: '',
    			size: 'lg',
    			value: '',
    			required: false,
    			footerStyle: {border: 'none', 'padding-top': 0},
    			values: false,
    			onSubmit: null,
    			widget: 'simpleloginui',
    			widgetInput: {},
    			shared: requestParams,
    			buttons: [{label: i18n.getMessage('Cancel'), cancel:true}]
    		};
    
    		var widgetURL = spUtil.getWidgetURL(options.widget);
    		$http.post(widgetURL, options.widgetInput).success(function(response) {
    			options.widget = response.result;
    			options.widget.options.shared = options.shared;
    			var modal = $uibModal.open({
    				templateUrl:'sp-modal.html',
    				controller: spModalCtrl,
    				size: options.size,
    				resolve: {
    					options: function() {
    						return options;
    					}
    				}
    			});
    
    			deferred.resolve(modal);
    		});
    		
    		return deferred.promise;
    	}
    
    	function spModalCtrl($scope, options) {
    		$scope.options = options;
    		$scope.form = {};
    
    		$scope.buttonClicked = function(button){
    			if (button.cancel) {
    				$scope.$dismiss();
    				return;
    			}
    		}
    	}
    
    	return {
    		prompt: _showAuthenticationModal
    	}
    }).decorator("spAuthModal", function($delegate) { return( $delegate );});