Skip to content

Ajax кросс-доменная асинхронная единая регистрация

1. Обзор

1.1 Описание проблемы

Система OA интегрирована с системой BI, и BI привязан к узлу системы OA. Если вы хотите реализовать единый вход в FineBI в системе OA, вам нужно передать имя пользователя и пароль на адрес аутентификации BI для аутентификации в интерфейсе входа в OA.

Если OA-система и BI-система не развернуты на одном сервере, а при входе в систему происходит кросс-домен, то как добиться кросс-доменного входа в OA-систему и BI-систему с помощью Ajax?

1.2 Идеи для решений

Оба метода входа iframe и Ajax могут реализовать междоменный единый вход, но Ajax может реализовать асинхронный единый вход и обрабатывать результаты аутентификации BI-системы, такие как таймаут входа; однако iframe не может обрабатывать асинхронную обработку и не может обрабатывать результаты аутентификации, когда аутентификация выполнена.

Метод входа Ajax естественным образом поддерживает кросс-доменность, поэтому в интерфейсе входа в систему OA имя пользователя и пароль напрямую отправляются на сервер BI через Ajax для аутентификации на внутреннем уровне, что решает проблему кросс-доменного единого входа.

2. Примеры

Запустите два проекта с номерами портов 37799 и 8080 соответственно и поместите новые HTML-файлы ajaxlogin.md и ajaxlogout.md в проект с номером порта 37799. Зайдите на сайт http://localhost:37799/webroot/ajaxlogin.md, введите имя пользователя и пароль проекта 8080 и получите успешный доступ к проекту 8080.

Откройте новую вкладку в успешно вошедшем в систему браузере, посетите сайт http://localhost:37799/webroot/ajaxlogout.md, нажмите кнопку "Выход", чтобы обновить страницу проекта 8080, на которой ранее был успешно выполнен вход, и пользователя выкинет из системы.

Примечание: Примеры, приведенные в этой главе, относятся к ПК.

2.1 Подготовка окружающей среды

1) Для примера в этой статье подготовлены два проекта:

Примечание: Оба проекта должны иметь одинаковые имя пользователя и пароль.

  • Локальный проект, номер порта 37799
  • Проект, развернутый в Tomcat на порту 8080.

Развертывание сервера Tomcat см. в разделе: Развертывание сервера Tomcat

2) Запустите два проекта.

2.2 Новая страница входа в систему

Примечание 1: Измените путь доступа или номер порта в коде в соответствии с реальной ситуацией.

Примечание 2: В среде интрасети файл jquery.min.js, указанный в следующем коде, не работает, вам нужно загрузить JS-файл локально и изменить соответствующий путь, пожалуйста, обратитесь к следующим шагам: Часто задаваемые вопросы по единому входу.

2.2.1 Отсутствие специальных символов в имени пользователя или пароле

Создайте новый HTML-файл с именем "ajaxlogin.md" со следующим кодом:

  
  
  
 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type"  
 content="text/html; " charset="UTF-8"> <script type="text/  
 javascript" src="https://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></script> &nbsp  
;<script type="text/javascript"> function doSubmit()&nbsp  
;{ var username = document.getElementById(&&  
 quot;username").value.trim(); var password =  
 document.getElementById("password").value.trim(); &nbsp  
; if (username === "") { &nbsp  
; window.alert("Пожалуйста, введите имя пользователя");  
  
 return false; } &  
 nbsp; if (password === "") { &nbsp ; window.alert("Please enter username"); return false; }  
 nbsp; window.alert("Пожалуйста, введите пароль"); &  
 nbsp; return false; &nbsp  
; } var url =& nbsp; "http://localhost:8080/webroot/decision/login/cross/domain" + "?fine_username=" + имя пользователя + "&fine_password=" + password + "&validity=" + -1;  
  
  
 alert(url); jQuery.ajax({ &  
 nbsp; url: url,// Единый вход для платформы администрирования Reporting Server &nbsp  
; таймаут: 5000,//таймаут в миллисекундах &nbsp  
 nbsp; dataType: "jsonp",//кросс-доменное использование jsonp &  
 nbsp; jsonp: "callback", &  
 nbsp; success: function (res) { &  
 nbsp; console.log(res);  
 if (res.errorCode) { & nbsp; success: function (res) { & nbsp; console.log(res); nbsp; &nbsp  
; window.alert(res.errorMsg);  
 }else { &  
 nbsp; // Сохраняем токен и переходим по соответствующей ссылке window.location.href = & & &   
 quot;http://localhost:8080/webroot/decision"; &  
 nbsp; } &  
 nbsp; }, error: function&  
 nbsp;() { &   
 nbsp;alert("Таймаут или другая ошибка сервера");// Вход не удался (таймаут или другая ошибка сервера) &nbsp  
  
; } }); &nbsp  
  
  
  
  
; } </script> </head> <body> <p>Пожалуйста, войдите</p> <form&  
 nbsp;id="login" name="login" method="POST" action=""> &  
 nbsp;<p>Имя пользователя:<input id="username" type="text" name="username"/></p> & nbsp; <p>Пароль:<input id="password" type="password" name=""  
 пароль"/></p> <input type="button" value="Login" onClick  
  
  
="doSubmit()"/> </form> </body> </html

2.2.2 Специальные символы в имени пользователя или пароле

Если в имени пользователя или пароле присутствуют специальные символы, например "&#", необходимо перекодировать имя пользователя или пароль. В этом разделе описаны два способа перекодировки имени пользователя или пароля:

1) Вариант 1: Используйте функцию encodeURIComponent() для транскодирования

var url = "http://localhost:8080/webroot/decision/login/cross/domain" + "?fine_username=&   
 quot; +encodeURIComponent(username) + "&fine_password=" + encodeURIComponent(password)&nbsp ;+ "&validity=" + -1;

Пример HTML-кода: programme1.md

2) Вариант 2: Использование данных для передачи параметров

data:{"fine_username":имя пользователя, "fine_password":пароль, validity:-1},

Пример HTML-кода: programme2.md

2.3 Страница выхода пользователя из системы

Создайте новый HTML-файл с именем "ajaxlogout.md" со следующим кодом:

Примечание: Измените путь доступа или номер порта в коде в соответствии с реальной ситуацией.

   
   
 <html> <head> <meta&  
 nbsp;http-equiv="Content-Type" content="text/html; " charset="UTF-8"> & lt;script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></   
 script> <script type="text/javascript">&   
   
   
 nbsp; function doSubmit() { jQuery.ajax({ &   
 nbsp;url: "http://localhost:8080/webroot/decision/logout/cross/domain",// сервер отчетов с единой регистрацией &   
   
 nbsp;dataType: "jsonp",//кросс-домен использует jsonp jsonp: "callback", &   
 nbsp; timeout:5000,//время таймаута (в миллисекундах) success:function(data) {&   
 nbsp; if (data.status === "   
 success") { &  
  
 nbsp; //Успешный выход из системы alert("Logged out"); } &nbsp   
   
   
; }, error:function(){ &   
   
  
 nbsp; // Выход не удался (таймаут или другая ошибка сервера) } }); &   
   
   
 nbsp;} </script> </head> <   
   
 body> <p>Пожалуйста, выйдите из системы</p> < form id="login" name="login" method="POST" action="" >&   
 nbsp; <input type="button&   
 quot; value="logout" onClick="doSubmit()" /> &   
   
 nbsp;</form> </body> </html>

2.4 Размещение HTML-файла в определенном месте

Поместите сохраненные файлы ajaxlogin.md и ajaxlogout.md в папку %BI_HOME%/webapps/webroot проекта с номером порта 37799, как показано на следующем рисунке:

1600841364807511.png

2.5 Отключение кнопок, связанных с защитой

1) Войдите в платформу с номером порта 37799 от имени администратора, нажмите "System Management > Управление безопасностью" и отключите "Защиту от атак с подслушиванием содержимого" и "Защиту от атак Clickjacking", как показано на следующем рисунке:

2) Аналогично закройте "Content Sniffing Attack Protection" и "Clickjacking Attack Protection" для проекта с номером порта 8080.

2.6 Эффекты просмотра

1) Откройте браузер и посетите сайт: http: //localhost:37799/webroot/ajaxlogin.md, введите учетную запись и пароль для проекта с номером порта 8080 и успешно получите доступ к проекту 8080. Как показано на рисунке ниже:

67.gif

2) Откройте новую вкладку браузера с успешным входом, посетите сайт http://localhost:37799/webroot/ajaxlogout.md, нажмите кнопку "Выход", переключитесь на страницу проекта 8080 с успешным входом, обновите страницу, и пользователя выкинет из логина. Как показано на рисунке ниже:

69.gif

Примечание: Если в обоих проектах на портах 37799 и 8080 включена SMS-аутентификация, то ajax-однократная регистрация на сайте http://localhost:37799/webroot/ajaxlogin.md时 пропустит SMS-аутентификацию и успешно войдет в систему.