E-Signatur aktivieren für Serviceportal

  • Freigeben Version: Xanadu
  • Aktualisiert 1. August 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-Registryan.
    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.

    SSO-Anmeldung in einem neuen Fenster aktivieren

    Öffnen Sie ein neues Fenster für die SSO-Authentifizierung, wenn Sie die 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 eSignatur-SSO-Anmeldung.

    Erforderliche Rolle: admin

    Prozedur

    1. Geben Sie das Skript spEsignatureCustom ein.
      1. Geben Sie im Filternavigator sys_ui_script.list ein.
      2. Wählen Sie Neuaus, und erstellen Sie ein neues UI-Skript.
      3. Geben Sie im Formular UI-Skript spEsignatureCustom im Feld API-Name ein.
      4. Wählen Sie im Feld UI-Typ die Option Mobile/Serviceportalaus.
      5. Fügen Sie das Skript spEsignatureCustom 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 im Feld API-Name ein.
      3. Wählen Sie im Feld UI-Typ die Option Mobile/Serviceportalaus.
      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 Service Portal > Portalean.
      2. Identifizieren Sie das Serviceportal, auf das Sie die E-Signatur-Unterstützung anwenden möchten, und wählen Sie das Design aus.
      3. Wählen Sie in den zugehörigen Listen JS-Einbindungenaus.
      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 UI-Skript spEsignatureCustom 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-Einbindungspaket einrichtet.
      6. Wählen Sie Absenden.

    Ergebnisse

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

    spEsignatureCustom-Skript

    Fügen Sie das Skript spEsignatureCustom 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 Skript spAuthCustom 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 );});