Кросс - авторизация
Тип статьи | Инструкция по настройке кроос-авторизации между двумя системами с ролевой моделью |
---|---|
Компетенции | 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
В файле настройки платформы рекомендуется использовать латиницу и не использовать пробелы в именах ролей