Activer la signature électronique pour Portail de services

  • Rversion finale: Washingtondc
  • Mis à jour 1 févr. 2024
  • 6 minutes de lecture
  • Vous pouvez configurer la signature électronique pour Portail de services exiger une nouvelle authentification de la part 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 Approvals with e-Signature [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 sont tenus de 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 sont toujours tenus de saisir un mot de passe. Pour plus d’informations sur la configuration de la signature électronique, reportez-vous à la section Approval with e-signature.

    Activer la connexion SSO dans une nouvelle fenêtre

    Ouvrez 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 de signature électronique.

    Rôle requis : admin

    Procédure

    1. Entrez le script spEsignatureCustom.
      1. Saisissez sys_ui_script.list dans le navigateur de filtre.
      2. Sélectionnez Nouveau, puis créez un nouveau script d’interface utilisateur.
      3. Sur 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/Service Portal.
      5. Collez le script spEsignatureCustom dans le champ Script .
      6. Sélectionnez Envoyer.
    2. Saisissez 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. Sur 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/Service Portal.
      4. Collez le script spAuthCustom dans le champ Script .
      5. Sélectionnez Envoyer.
    3. Associez les scripts d’interface utilisateur à l’enregistrement Include JS.
      1. Accédez à la Portail de services > Portails.
      2. Identifiez le portail de services auquel vous souhaitez appliquer la prise en charge de la signature électronique et sélectionnez le thème.
      3. Dans les listes connexes, sélectionnez Includes JS.
      4. Sélectionnez Nouveau.
      5. Renseignez les champs du formulaire.
        Tableau 1. Formulaire Include JS
        Champ Description
        Nom d'affichage Nom de votre include JS. Saisissez 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 de votre enregistrement Include JS. Sélectionnez un script d’interface utilisateur.
        Script d'interface utilisateur Source de 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 Include JS. L'application par défaut est Global.
        Mis à jour Champ affichant la date de la dernière mise à jour de l’enregistrement.
        Package Champ qui établit le package JS Include.
      6. Sélectionnez Envoyer.

    Résultats

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

    script spEsignatureCustom

    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
    		};
    
    	};
    });
    

    Script spAuthCustom

    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 );});