Перейти к концу метаданных
Переход к началу метаданных

Вы просматриваете старую версию данной страницы. Смотрите текущую версию.

Сравнить с текущим просмотр истории страницы

« Предыдущий Версия 6 Следующий »

Тип статьи

Инструкция по настройке кроос-авторизации между двумя системами с ролевой моделью

Компетенции

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

В файле настройки платформы рекомендуется использовать латиницу и не использовать пробелы в именах ролей

  • Нет меток