E-Signatur für aktivieren Serviceportal

  • Freigeben Version: Yokohama
  • Aktualisiert 30. Januar 2025
  • 5 Minuten Lesedauer
  • Sie können E-Signatur in konfigurieren ServiceportalUm eine erneute Authentifizierung von genehmigenden Anwendern anzufordern.

    Vorbereitungen

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

    Erforderliche Rolle: Administrator

    Prozedur

    1. Aktivieren Sie das Plugin „Genehmigungen mit E-Signatur“ [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 möchten.

    Ergebnisse

    Wenn E-Signatur aktiviert ist, müssen Genehmiger ein Passwort 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 Passwort eingeben. Weitere Informationen zum Konfigurieren der E-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 unterstützt Serviceportal.

    Weitere Informationen finden Sie unter KB-artikel für SSO-Anmeldung mit E-Signatur .

    Erforderliche Rolle: Administrator

    Prozedur

    1. Geben Sie das Skript spEsignatureCustom ein.
      1. Eingabetaste sys_ui_script.list Im Filternavigator.
      2. Wählen Sie Aus Neu , Und erstellen Sie ein neues UI-Skript.
      3. Geben Sie im UI-Skript-Formular ein SpEsignatureAnwenderdefiniert Im Feld API-Name.
      4. Wählen Sie im Feld UI-Typ die Option aus Mobil/Serviceportal .
      5. Fügen Sie ein SpEsignatureAnwenderdefiniertes Skript In Skript Feld.
      6. Wählen Sie Absenden.
    2. Geben Sie das Skript spAuthCustom ein.
      1. In derselben sys_ui_script.list Tabelle, erstellen Sie ein weiteres neues UI-Skript, indem Sie auswählen Neu .
      2. Geben Sie im UI-Skript-Formular ein SpAuthAnwenderdefiniert Im Feld API-Name.
      3. Wählen Sie im Feld UI-Typ die Option aus Mobil/Serviceportal .
      4. Fügen Sie ein SpAuthAnwenderdefiniertes Skript In Skript Feld.
      5. Wählen Sie Absenden.
    3. Ordnen Sie die UI-Skripts dem JS-Include-Datensatz zu.
      1. Navigieren zu Serviceportal > Portalean.
      2. Identifizieren Sie das Serviceportal, auf das Sie die esignature-Unterstützung anwenden möchten, und wählen Sie das Design aus.
      3. Wählen Sie in den zugehörigen Listen aus JS-Einbindungen .
      4. Wählen Sie Neu.
      5. Füllen Sie im Formular die Felder aus.
        Tabelle : 1. JS-Einbindungsformular
        Feld Beschreibung
        Anzeigename Name für Ihre JS-Include. Eingabetaste SpEsignatureAnwenderdefiniert Und ordnen Sie den Datensatz dem von Ihnen erstellten spEsignatureAnwenderdefinierten UI-Skript zu, oder geben Sie ein SpAuthAnwenderdefiniert Und ordnen Sie den Datensatz der von Ihnen erstellten spAuthCustom zu.
        Quelle Quelle für Ihren JS-Include-Datensatz. Wählen Sie Aus UI-Skript .
        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 angezeigt wird, wann der Datensatz zuletzt aktualisiert wurde.
        Paket Feld, das das JS-Include-Paket herstellt.
      6. Wählen Sie Absenden.

    Ergebnisse

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

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

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