Habilitar assinatura eletrônica para Portal de serviços

  • Versão de lançamento: Yokohama
  • Atualizado 30 de jan. de 2025
  • 5 min. de leitura
  • Você pode configurar a assinatura eletrônica em Portal de serviços para exigir nova autenticação dos usuários de aprovação.

    Antes de Iniciar

    A propriedade do sistema com.snc.integration.esig.window é compatível para habilitar o login do SSO em uma nova janela.

    Função necessária: administrador

    Procedimento

    1. Ative o plug-in Approvals with e-Signature [com.glide.e_signature_approvals].
    2. Navegar até Definição do Sistema > Registro da Assinatura Eletrônica.
    3. Adicione à lista todas as tabelas para as quais você deseja exigir uma assinatura eletrônica.

    Resultado

    Com a assinatura eletrônica habilitada, os aprovadores são obrigados a fornecer uma senha para aprovar ou rejeitar solicitações. A autenticação com ID de toque funciona no aplicativo para celular. Na Web para dispositivos móveis, os aprovadores ainda precisam inserir uma senha. Para obter mais informações sobre como configurar a assinatura eletrônica, consulte Approval with e-signature.

    Habilitar login do SSO em uma nova janela

    Abra uma nova janela para autenticação SSO ao usar a assinatura eletrônica para aprovações.

    Antes de Iniciar

    O login do SAML (Security Assertion Markup Language, Linguagem de marcação de segurança) só é compatível com a área de trabalho Portal de serviços.

    Para obter informações adicionais, consulte o artigo da base de conhecimento de login do SSO de assinatura eletrônica.

    Função necessária: administrador

    Procedimento

    1. Insira o script spEsignatureCustom.
      1. Insira sys_ui_script.list no Navegador de filtros.
      2. Selecione Novoe crie um novo script de IU.
      3. No formulário Script de IU, insira spEsignatureCustom no campo Nome da API.
      4. No campo Tipo de IU, selecione Mobile/Portal de serviços.
      5. Cole o script spEsignatureCustom no campo Script.
      6. Selecione Enviar.
    2. Insira o script spAuthCustom.
      1. Na mesma tabela sys_ui_script.list, crie outro novo script de IU selecionando Novo.
      2. No formulário Script de IU, insira spAuthCustom no campo Nome da API.
      3. No campo Tipo de IU, selecione Mobile/Portal de serviços.
      4. Cole o script spAuthCustom no campo Script.
      5. Selecione Enviar.
    3. Associe os scripts de IU ao registro de inclusão de JS.
      1. Navegar até Portal de serviços > Portais.
      2. Identifique o Portal de serviços ao qual você deseja aplicar o suporte de assinatura eletrônica e selecione o tema.
      3. Nas listas relacionadas, selecione JS Inclusões.
      4. Selecione Novo.
      5. No formulário, preencha os campos.
        Tabela 1. Formulário de inclusão de JS
        Campo Descrição
        Nome de exibição Nome da sua inclusão JS. Insira spEsignatureCustom e associe o registro ao script de IU spEsignatureCustom que você criou ou insira spAuthCustom e associe o registro ao spAuthCustom que você criou.
        Fonte Origem do registro de inclusão de JS. Selecione Script de IU.
        Script da IU Origem do script de IU para o registro de inclusão de JS. Selecione spEsignatureCustom ou spAuthCustom, dependendo do registro que você está criando.
        Aplicação Aplicação para o registro de inclusão de JS. A aplicação padrão é Global.
        Atualizado em Campo que exibe quando o registro foi atualizado pela última vez.
        Pacote Campo que estabelece o pacote JS Include.
      6. Selecione Enviar.

    Resultado

    Uma nova janela é aberta quando você usa a Assinatura eletrônica para aprovações.

    Script spEsignatureCustom

    Cole o script spEsignatureCustom no campo 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

    Cole o script spAuthCustom no campo 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 );});