---
sourceDocument: Interface do usuário da Now Platform Yokohama
sourceDocumentLink: https://servicenow-prod.fluidtopics.net/r/pt-BR/yokohama/platform-user-interface

 Release :

    - yokohama

ft:locale :

    - pt-BR

ft:publication_title :

    - Interface do usuário da Now Platform Yokohama

ft:clusterId :

    - platux

bundleId :

    - platux

workflow :

    - Platform


---

# Habilite a assinatura eletrônica para Portal de serviços

# Habilite a assinatura eletrônica para Portal de serviços {#ariaid-title1}

* Versão de lançamento: Yokohama
* 
* Atualizado 30 de jan. de 2025
* 
* ![](https://www.servicenow.com/docs/portal-asset/ico-clock) 5 min. de leitura

Você pode configurar a assinatura eletrônica em Portal de serviçospara exigir uma nova autenticação da aprovação de usuários.

## Antes de Iniciar

. com.snc.integration.esig.windowA propriedade do sistema é compatível para habilitar o login SSO em uma nova janela.
Função necessária: administrador

## Procedimento

1. Ative as aprovações com o plug-in Assinatura eletrônica \[com.glide.e_signature_approvations\].
2. Navegar até Definição do SistemaRegistro 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 devem fornecer uma senha para aprovar ou rejeitar solicitações. A autenticação com touch ID funciona no app para celular. Na web para celular, os aprovadores ainda precisam inserir uma senha. Para obter mais informações sobre como configurar a assinatura eletrônica, consulte [Approval with e-signature](https://www.servicenow.com/docs/access?context=approval-with-e-signature&version=yokohama&pubname=yokohama-build-workflows&ft:locale=en-US).

## Habilite o login SSO em uma nova janela {#ariaid-title2}

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

### Antes de Iniciar

O login SAML (Security Assertion Markup Language) só é compatível com a área de trabalho Portal de serviços.

Para obter informações adicionais, consulte [artigo da base de conhecimento de login de SSO com assinatura eletrônica](https://support.servicenow.com/kb?id=kb_article_view&sys_kb_id=2dca1fe8db49a010190b1ea668961999).

Função necessária: administrador

### Procedimento

1. Insira o script spEssignatureCustom.
   1. Insira <kbd class="ph userinput">sys_ui_script.list </kbd>No navegador Filtro.
   2. Selecione Novo E crie um novo script de IU.
   3. No formulário Script de IU, insira <kbd class="ph userinput">SEssignatureCustom </kbd>No campo Nome da API.
   4. No campo Tipo de IU, selecione Portal de serviços/celular .
   5. Cole o. [Script personalizado de spEsignatureCustom](https://servicenow-prod.fluidtopics.net/fAJtCgAYrbQzfl7ev1HcFw#spEsignatureCustom-script "Cole o script spEssignatureCustom no campo de script sys_ui_script.list.")em Script campo.
   6. Selecione Enviar.
   {#enable-sso-login__substeps_kzw_jyb_bqb}
2. Insira o script spAuthCustom.
   1. No mesmo <kbd class="ph userinput">sys_ui_script.list </kbd>Selecione para criar outro novo script de IU Novo .
   2. No formulário Script de IU, insira <kbd class="ph userinput">SpAuthCustom </kbd>No campo Nome da API.
   3. No campo Tipo de IU, selecione Portal de serviços/celular .
   4. Cole o. [Script spAuthCustom](https://servicenow-prod.fluidtopics.net/fAJtCgAYrbQzfl7ev1HcFw#spAuthCustom-script "Cole o script spAuthCustom no campo de script sys_ui_script.list.")em Script campo.
   5. Selecione Enviar.
   {#enable-sso-login__substeps_fb3_syb_bqb}
3. Associe os scripts de IU ao registro de inclusão de JS.
   1. Navegar até Portal de serviçosPortais.
   2. Identifique o portal de serviços ao qual você deseja aplicar o suporte de assinatura e selecione o tema.
   3. Nas listas relacionadas, selecione JS incluídos .
   4. Selecione Novo.
   5. No formulário, preencha os campos.  
      {#enable-sso-login__table_rhs_czb_bqb__entry__2}

      | Campo | Descrição |
      |-|-|
      | Nome de exibição | Nome da inclusão de JS. Insira <kbd class="ph userinput">SEssignatureCustom </kbd>E associe o registro ao script de IU spEssignatureCustom que você criou ou insira <kbd class="ph userinput">SpAuthCustom </kbd>E associe o registro ao spAuthCustom que você criou. |
      | Origem | Origem do registro de inclusão JS. Selecione Script de IU . |
      | Script da IU | Origem do script de IU para o registro de inclusão de JS. Selecione spEssignatureCustom ou spAuthCustom dependendo do registro que você está criando. |
      | Aplicação | Aplicação para o registro de inclusão JS. A aplicação padrão é Global. |
      | Atualização em | Campo que exibe quando o registro foi atualizado pela última vez. |
      | Pacote | Campo que estabelece o pacote de inclusão JS. |
      [Tabela 1. JS Include form]

      {#enable-sso-login__table_rhs_czb_bqb}
   6. Selecione Enviar.
   {#enable-sso-login__substeps_xrw_zyb_bqb}

### Resultado

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

## Script personalizado de spEsignatureCustom {#ariaid-title3}

Cole o script spEssignatureCustom 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 {#ariaid-title4}

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


