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

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

Тип статьи

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

Компетенции

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

 

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

Related content

Полезности
Полезности
Read with this
Настройки виджета "Регламентный отчет"
Настройки виджета "Регламентный отчет"
More like this
Что нового в Visiology Platform 3.7
Что нового в Visiology Platform 3.7
Read with this
Настройки виджета "Регламентный отчет"
Настройки виджета "Регламентный отчет"
More like this
Настройки виджета "Регламентный отчет"
Настройки виджета "Регламентный отчет"
More like this
Настройки виджета "Регламентный отчет"
Настройки виджета "Регламентный отчет"
More like this