E-Signatur aktivieren für Serviceportal

  • Freigeben Version: Washingtondc
  • Aktualisiert 1. Februar 2024
  • 5 Minuten Lesedauer
  • Sie können die E-Signatur in Serviceportal so konfigurieren, dass eine erneute Authentifizierung von genehmigenden Benutzern erfordert wird.

    Vorbereitungen

    Die Systemeigenschaft com.snc.integration.esig.window wird unterstützt, um die SSO-Anmeldung in einem neuen Fenster zu aktivieren.

    Erforderliche Rolle: admin

    Prozedur

    1. Aktivieren Sie die Freigaben mit dem E-Signatur-Plugin [com.glide.e_signature_approvals].
    2. Navigieren zu Systemdefinition > e-Signature-Registry.
    3. Fügen Sie der Liste alle Tabellen hinzu, für die Sie eine E-Signatur benötigen.

    Ergebnisse

    Wenn die elektronische Signatur aktiviert ist, müssen Genehmiger ein Kennwort angeben, um Anforderungen zu genehmigen oder abzulehnen. Die Authentifizierung mit Touch-ID funktioniert in der mobilen App. Im mobilen Web müssen Genehmiger weiterhin ein Kennwort eingeben. Weitere Informationen zum Konfigurieren der elektronischen Signatur finden Sie unter Approval with e-signature.

    Aktivieren Sie die SSO-Anmeldung in einem neuen Fenster

    Öffnen Sie ein neues Fenster für die SSO-Authentifizierung, wenn Sie E-Signatur für Genehmigungen verwenden.

    Vorbereitungen

    Die SAML-Anmeldung (Security Assertion Markup Language) wird nur auf dem Desktop Serviceportalunterstützt.

    Weitere Informationen finden Sie im KB-Artikel zur E-Signatur-SSO-Anmeldung.

    Erforderliche Rolle: admin

    Prozedur

    1. Geben Sie das spEsignatureCustom-Skript ein.
      1. Geben Sie sys_ui_script.list im Filternavigator ein.
      2. Wählen Sie Neuaus, und erstellen Sie ein neues UI-Skript.
      3. Geben Sie im Formular „UI-Skript “ spEsignatureCustom in das Feld API-Name ein.
      4. Wählen Sie im Feld UI-Typ Mobile/Service Portalaus.
      5. Fügen Sie das spEsignatureCustom-Skript in das Feld Skript ein.
      6. Wählen Sie Absenden.
    2. Geben Sie das spAuthCustom-Skript ein.
      1. Erstellen Sie in derselben Tabelle sys_ui_script.list ein weiteres neues UI-Skript, indem Sie Neuauswählen.
      2. Geben Sie im Formular „UI-Skript “ spAuthCustom in das Feld API-Name ein.
      3. Wählen Sie im Feld UI-Typ Mobile/Service Portalaus.
      4. Fügen Sie das spAuthCustom-Skript in das Feld Skript ein.
      5. Wählen Sie Absenden.
    3. Ordnen Sie die UI-Skripts dem JS-Include-Datensatz zu.
      1. Navigieren zu Serviceportal > Portale.
      2. Identifizieren Sie das Service Portal, auf das Sie den E-Signatur-Support anwenden möchten, und wählen Sie das Design aus.
      3. Wählen Sie in den zugehörigen Listen JS Includesaus.
      4. Wählen Sie Neu.
      5. Füllen Sie die Felder des Formulars aus.
        Tabelle : 1. JS-Include-Formular
        Feld Beschreibung
        Anzeigename Name für Ihre JS-Einbindung. Geben Sie spEsignatureCustom ein, und ordnen Sie den Datensatz dem von Ihnen erstellten spEsignatureCustom-UI-Skript zu, oder geben Sie spAuthCustom ein, und ordnen Sie den Datensatz dem von Ihnen erstellten spAuthCustom zu.
        Quelle Quelle für Ihren JS-Include-Datensatz. Wählen Sie UI-Skript aus.
        UI-Skript UI-Skriptquelle für Ihren JS-Include-Datensatz. Wählen Sie je nach Datensatz, den Sie erstellen, entweder spEsignatureCustom oder spAuthCustom aus.
        Anwendung Anwendung für Ihren JS-Include-Datensatz. Die Standardanwendung ist Global.
        Aktualisiert Feld, das anzeigt, wann der Datensatz zuletzt aktualisiert wurde.
        Paket Feld, das das JS-Include-Paket erstellt.
      6. Wählen Sie Absenden.

    Ergebnisse

    Wenn Sie E-Signatur für Genehmigungen verwenden, wird ein neues Fenster geöffnet.

    spEsignatureCustom-Skript

    Fügen Sie das spEsignatureCustom-Skript in das Skriptfeld sys_ui_script.list ein.

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

    spAuthCustom-Skript

    Fügen Sie das spAuthCustom-Skript in das Skriptfeld sys_ui_script.list ein.

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