Тип статьи | Инструкция по настройке кроос-авторизации между двумя системами с ролевой моделью |
---|---|
Компетенции | JS, HTML, PHP, SSH |
Необходимые права | root, администратор платформы |
Версия платформы | 2.26 |
Статус | ЧЕРНОВИК |
Сложность | Сложно |
Полезные ссылки | |
Дополнительные сведения |
📋 Подробное описание
Механизм внешней аторизации предполагается формирование специального токена на стороне внешней системы, настройку кросс-авторизационного файла в платформе и внедрение формы с post запросом для редиректа в портал без авторизации.
Составные части токена
Токен состоит из трех частей: header, payload, signature. Токен состоит из этих трех частей, разделенных точками.
Заголовок
HEADER – заголовок - содержит информацию об алгоритме, с помощью которого формировался токен и о типе токена. Предоставляется в виде JSON объекта. В случае кросс-авторизации с платформой Visiology, header всегда один:
{
"alg": "HS256",
"typ": "JWT"
}
К заголовку применяется алгоритм кодирования Base64-URL.
Полезная нагрузка
PAYLOAD – полезная нагрузка - содержит информацию о текущем пользователе и некоторые системные ключи (чаще всего - детали формировании токена). Предоставляется в виде JSON объекта.
Обязательные поля в payload:
Наименование поля | Тип | Описание | Примечание |
username | string | Имя пользователя | Обязательно для заполнения |
section | string | Идентификатор внешней системы. Используется для избежания коллизий между пользователями в случае, если есть несколько внешних систем и одно и то же имя пользователя может быть в разных внешних системах. | Обязательно для заполнения |
userRoles | Массив string. Также возможен список integer. | Массив-список идентификаторов ролей | Непустой массив. Обязательно должно быть передано хоть одно значение. Если список передается в формате integer, происходит неявное преобразование в string. |
iat | String | Время в формате Unix Time, определяющее момент, когда токен был создан. | Обязательно для заполнения |
exp | String | Время в формате Unix Time, определяющее момент, когда токен станет не валидным (expiration). | Обязательно для заполнения |
iss | string | Чувствительный к регистру URI, который является уникальным идентификатором стороны, генерирующей токен (issuer). | Должен быть корректный URI |
Помимо обязательных полей, токен также может содержать необязательные поля – детали описаны в разделе «Динамические права доступа при кросс-авторизации».
К payload применяется алгоритм кодирования Base64-URL.
Подпись
SIGNATURE – подпись токена авторизации. Используется, чтобы гарантировать, что запрос на кросс-авторизацию не был изменен в процессе передачи от внешней системы к платформе Visiology.
Подпись заголовка и полезной нагрузки производится при помощи алгоритмов HMAC с использованием SHA-256 (HS256). Формула формирования подписи:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
SECRET_KEY)
К подписи применяется алгоритм кодирования Base64-URL.
Условный код формирования токена
header = '{"alg":"HS256","typ":"JWT"}' // строка payload = '{"user_id":1,"exp":1581357039}' // строка headerBase64 = base64urlEncode(header) payloadBase64 = base64urlEncode(payload) data = headerBase64 + '.' + payloadBase64 secret = '123456' sig = HMAC-SHA256(data, secret) sigBase64 = base64urlEncode(sig) jwt = data + '.' + sigBase64
Конфигурация платформы Visiology
При неободимости использования механизма кросс-авторизации, в рамках установки аналитической платформы Visiology требуется настройка конфигурационного файла платформы.
Конфигурационный файл имеет название externalAccount.config.json и представляет из себя файл в формате JSON. Настройки системы кросс-авторизации берутся из файла при старте платформы и не меняются в процессе работы, даже если этот файл был изменен. Для применения нового файла конфигурации требуется перезапуск платформы Visiology.
Конфигурационный файл хранится в виде JSON объекта и содержит следующие поля:
|
|
|
|
issuer | string, должен быть корректный URI | Чувствительный к регистру URI внешней системы, которая является уникальным идентификатором стороны, генерирующей токен | Обязательно для заполнения. |
jwtKey | string | Секретный ключ для алгоритма HMAC. Его знают два клиента – внешняя система и платформа Visiology | Обязательно для заполнения. |
rolesMapping | Массив значений { “id”: string, “name”:string } | Маппинг-соотношение внешних ролей пользователя к внутренним ролям системы | Обязательно для заполнения. |
attributeFilters | Массив значений string | Перечень атриубтов, по которым предпологается фильтрация на источнике данных ViQube. | Обязательно для заполнения. Сам массив может быть пустым – содержать 0 элементов |
Файл для редиректа
<!DOCTYPE html> <html><head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> </head><body></body> <script> var url = 'http://visiologyServer/idsrv/ExternalAccount/Login'; var form = $('<form action="' + url + '" method="post" >' + '<input type="hidden" name="token" value="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InNpZG9yb3YiLCJzZWN0aW9uIjoic3lzdGVtIiwidXNlclJvbGVzIjpbMTAxLDEwMl0sImlhdCI6MTU5OTgzNjkyMiwiZXhwIjoxNTk5OTk2OTIyLCJpc3MiOiJodHRwczovL2JpLmV4dGVybmFsU3lzdGVtLnJ1In0.lZJMEluzmnM6lZ6qfDqnA3b1TEJMmT8_PIzTGM-qTuA" />' + '</form>'); $('body').append(form); form.submit(); </script> </html>
В ответе платформа инициирует редирект на портал.
Практический пример
Имеем сервер joomla4 на http://joomla.test.com и платформу на http://visiology-cross.org
Статья с инъекцией php (фактический url index.php?view=article&id=2:test-redirect&catid=2
)
{source} <?php $user = JFactory::getUser(); $userRoles = []; foreach($user->groups as $key => $value) array_push($userRoles,$value); $header = json_encode(['alg' => 'HS256', 'typ' => 'JWT']); $payload = json_encode([ 'username' => $user->username, 'section' => 'joomla', 'userRoles' => $userRoles, 'iat'=> time(), 'exp' => time()+15*60, 'iss'=> "http://joomla.test.com"],JSON_UNESCAPED_SLASHES); $headerUrlBase64 = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($header)); $payloadUrlBase64 = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($payload)); $key = 'c4;RZa9"iSszk@j'; $data = $headerUrlBase64.'.'.$payloadUrlBase64; $sig = hash_hmac('sha256',$data, $key, true); $base64UrlSignature = str_replace(['+', '/', '='], ['-', '_', ''], base64_encode($sig)); $jwt = $data.'.'.$base64UrlSignature; ?> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> <script> var url = 'http://visiology-cross.org/idsrv/ExternalAccount/Login'; var form = $('<form action="' + url + '" method="post" >' + '<input type="hidden" name="token" value="<?php echo $jwt; ?>" /></form>'); $('body').append(form); </script> {/source}
Статья , в которой будет показан дашборд
<iframe class="iframe" src="index.php?view=article&id=2:test-redirect&catid=2" name="Preview" width="340" height="280"></iframe>
docker-volume/identity-server/configuration/externalAccount.config.json
{ "issuer": "http://joomla.test.com", "jwtKey": 'c4;RZa9"iSszk@j', "rolesMapping": [ { "id": "8", "name": "joomla" } ], "attributeFilters": [] }r
Для редиректа не на портал, а на конкретный дашборд корректируем на платформе nginx
location / { if ($http_referer ~ ^http://joomla.test.com) { return 301 /viewer?dashboardGuid=25c2b3c35dcf450689ed0e462f38461f; } proxy_pass $portal_url; }
В файле настройки платформы рекомендуется использовать латиницу и не использовать пробелы в именах ролей