Кросс - авторизация

Тип статьи

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

Компетенции

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}

 

Статья , в которой будет показан дашборд

 

docker-volume/identity-server/configuration/externalAccount.config.json

Для редиректа не на портал, а на конкретный дашборд корректируем на платформе nginx

 

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