var jAuth = {}, // global variable used in Mobile ID & Smart ID authentication idCardInitialized = false, idCard = { certificate: null, certificateInfo: null, dbts: null, token: null, dtbsHash: null, signatureValue: null }, sessionToken = null, controlCode = null, checkLoginStatusPollsDone = 0, // Expire after 120 seconds if Mobile ID code not verified selectedMethod = null; // the authentication method that was last clicked var checkAuthStatus = function(url) { $.getJSON(url, { sessionToken: sessionToken }, function(data, textStatus, jqXHR) { if (data.Status === "ok") { $('#jAuthStatus p').text('Laen...'); window.top.location.href = data.RedirectUrl; } else if (data.Status === "waiting") { console.debug(`Authentication still underway (${data.Message})`); if (checkLoginStatusPollsDone > 48) { alert('Sessioon aegus'); checkLoginStatusPollsDone = 0; hideAuthStatus(); return; } checkLoginStatusPollsDone++; setTimeout(function() { checkAuthStatus(url); }, 2500); } else if (data.Status === 'canceled') { alert('Isikutuvastamine katkestatud'); hideAuthStatus(); } else { const errorMsg = ExtractAuthenticationErrors(data); alert(`Isikutuvastamine ebaõnnestus\n${errorMsg}`); hideAuthStatus(); } }).error(function(jqXHR, textStatus, errorThrown) { alert(`Isikutuvastamine ebaõnnestus: ${errorThrown}`); hideAuthStatus(); } ); }; function showAuthStatus() { $('#jAuthStatus').show(); $('#jAuthWrapper').hide(); $('#jAuthButtonsWrapper').hide(); $('#jAuthPhoneNoWrapper').hide(); $('#jAuthNationalIdWrapper').hide(); } function hideAuthStatus() { $('#jAuthStatus').hide(); $('#jAuthWrapper').show(); $('#jAuthButtonsWrapper').show(); if (selectedMethod == 'mobileId') showMobileIdFields(); else if (selectedMethod == 'smartId') showSmartIdFields(); } function showMobileIdFields() { $('#jAuthWrapper').show(); $('#jAuthPhoneNoWrapper').show(); $('#jAuthNationalIdWrapper').show(); } function showSmartIdFields() { $('#jAuthWrapper').show(); $('#jAuthPhoneNoWrapper').hide(); $('#jAuthNationalIdWrapper').show(); } function initIdCardAuth() { console.debug('Initializing initIdCardAuth..'); try { if (iSignApplet.isInitialized) { iSignApplet.requestLogin('ee'); } else { iSignApplet.translations.et.title = 'Isikutuvastus'; iSignApplet.init({ language: 'et', certificatePurpose: 'login', supportedResidencies: ['ee'], authenticationUrls: { 'ee': 'https://auth.dokobit.com' } }); } idCardInitialized = true; } catch (ex) { console.error('Error initializing ID card applet', ex); hideAuthStatus(); } } /** * This method will be automatically called by our library when user selects his certifcate. */ function authenticationTokenReceived(token) { if (token != null) { $.post( jAuth.idCardAuthUrl, { token, redirectUrl: jAuth.redirectUrl }, function(data) { if (data.Status === "ok") { $('#jAuthStatus p').text('Laen...'); window.top.location.href = data.RedirectUrl; } else if (data.Status === 'canceled') { alert('Isikutuvastamine katkestatud'); hideAuthStatus(); } else { const errorMsg = ExtractAuthenticationErrors(data); alert(`Isikutuvastamine ebaõnnestus\n${errorMsg}`); hideAuthStatus(); } } ).error(function(jqXHR, textStatus, errorThrown) { alert(`Isikutuvastamine ebaõnnestus: ${errorThrown}`); hideAuthStatus(); }); } else hideAuthStatus(); } function onCertificateNotFound() { hideAuthStatus(); } function onUserCancel() { hideAuthStatus(); } function mobileIdClick() { selectedMethod = 'mobileId'; $('#isign-applet').hide(); $('#jAuthWrapper').show(); $('#jAuthPhoneNoWrapper').show(); $('#jAuthNationalIdWrapper').show(); var jAuthPhoneNo = $.trim($('#jAuthPhoneNo').val()); const jAuthNationalId = $.trim($('#jAuthNationalId').val()); var errors = false; if (jAuthPhoneNo == '') { $('#jAuthPhoneNoError').show(); errors = true; } else $('#jAuthPhoneNoError').hide(); if (jAuthNationalId == '') { $('#jAuthNationalIdError').show(); errors = true; } else $('#jAuthNationalIdError').hide(); if (errors) { if (jAuthPhoneNo == '') $('#jAuthPhoneNo').focus(); else $('#jAuthNationalId').focus(); } else { $('#jAuthPhoneNoWrapper').hide(); $('#jAuthNationalIdWrapper').hide(); $('#jAuthStatus p').text(''); showAuthStatus(); sessionToken = null; controlCode = null; $.post(jAuth.mobileIdStartUrl, { phoneNo: jAuthPhoneNo, nationalId: jAuthNationalId }, function(data, textStatus, jqXHR) { if (data.Status === 'nationalIdRequired') { hideAuthStatus(); $('#jAuthWrapper').show(); $('#jAuthPhoneNoWrapper').show(); $('#jAuthNationalIdWrapper').show(); $('#jAuthNationalId').focus(); return; } if (data.Status === 'canceled') { alert('Isikutuvastamine katkestatud'); hideAuthStatus(); $('#jAuthWrapper').show(); $('#jAuthPhoneNoWrapper').show(); $('#jAuthNationalIdWrapper').show(); return; } if (data.Status !== "ok") { const errorMsg = ExtractAuthenticationErrors(data); alert(`Isikutuvastamine ebaõnnestus\n${errorMsg}`); hideAuthStatus(); $('#jAuthWrapper').show(); $('#jAuthPhoneNoWrapper').show(); $('#jAuthNationalIdWrapper').show(); return; } sessionToken = data.Token; controlCode = data.ControlCode; $('#jAuthStatus p').text(`Palun kontrollige, et Mobiil-ID teie telefonis kuvab sama turvakoodi, mis siin: ${controlCode}`); checkLoginStatusPollsDone = 0; var url = jAuth.mobileIdStatusUrl + '?phoneNo=' + encodeURIComponent(jAuthPhoneNo) + '&redirectUrl=' + encodeURIComponent(jAuth.redirectUrl || ''); setTimeout(function() { checkAuthStatus(url); }, 2500); }).error(function(jqXHR, textStatus, errorThrown) { alert(`Isikutuvastamine ebaõnnestus: ${errorThrown}`); hideAuthStatus(); } ); } return false; } function smartIdClick() { selectedMethod = 'smartId'; $('#isign-applet').hide(); $('#jAuthWrapper').show(); $('#jAuthNationalIdWrapper').show(); $('#jAuthNationalId').focus(); $('#jAuthPhoneNoWrapper').hide(); const jAuthNationalId = $.trim($('#jAuthNationalId').val()); var errors = false; if (jAuthNationalId == '') { $('#jAuthNationalIdError').show(); errors = true; } else $('#jAuthNationalIdError').hide(); if (!errors) { $('#jAuthNationalIdWrapper').hide(); $('#jAuthStatus p').text(''); showAuthStatus(); sessionToken = null; controlCode = null; $.post(jAuth.smartIdStartUrl, { nationalId: jAuthNationalId }, function(data, textStatus, jqXHR) { if (data.Status === 'canceled') { alert('Isikutuvastamine katkestatud'); hideAuthStatus(); return; } if (data.Status !== "ok") { const errorMsg = ExtractAuthenticationErrors(data); alert(`Isikutuvastamine ebaõnnestus\n${errorMsg}`); hideAuthStatus(); return; } sessionToken = data.Token; controlCode = data.ControlCode; $('#jAuthStatus p').text(`Palun kontrollige, et Smart ID teie telefonis kuvab sama turvakoodi, mis siin: ${controlCode}`); checkLoginStatusPollsDone = 0; var url = jAuth.smartIdStatusUrl + '?redirectUrl=' + encodeURIComponent(jAuth.redirectUrl || ''); setTimeout(function() { checkAuthStatus(url); }, 2500); }).error(function(jqXHR, textStatus, errorThrown) { alert(`Isikutuvastamine ebaõnnestus: ${errorThrown}`); hideAuthStatus(); } ); } return false; } function authKeyPress(e) { if (e.which === 13) { if (selectedMethod === 'mobileId') $('#jAuthMobileIdBtn').click(); else if (selectedMethod === 'smartId') $('#jAuthSmartIdBtn').click(); return false; } } function idCardClick() { selectedMethod = 'idcard'; idCard.certificate = null; idCard.certificateInfo = null; idCard.algorithm = null; idCard.dbts = null; idCard.dtbsHash = null; idCard.signatureValue = null; $('#isign-applet').show(); showAuthStatus(); if (!idCardInitialized) initIdCardAuth(); else iSignApplet.requestLogin('ee'); return false; } /** * Extracts errors from Mobile ID or Smart ID authentication response and returns them as formatted string * * @param data - response returned from authentication service */ function ExtractAuthenticationErrors(data) { var errorMsg = ''; if (data.Errors != null && data.Errors.length != 0) { for (var i = 0; i < data.Errors.length; i++) { if (data.Errors[i].Field == '[phone]') errorMsg += "Palun sisestage korrektsel kujul telefoninumber\n"; else if (data.Errors[i].Field == '[code]') errorMsg += "Vabandage, kuid sisestatud isikukood on vigane\n"; else errorMsg += data.Errors[0].Field + " " + data.Errors[0].Message + "\n"; } } else errorMsg = data.Message; return errorMsg; } $(function() { $('#jAuthIdCardBtn').click(idCardClick); $('#jAuthMobileIdBtn').click(mobileIdClick); $('#jAuthSmartIdBtn').click(smartIdClick); $('#jAuthPhoneNo, #jAuthNationalId').keypress(authKeyPress); });