GATE-SERVICE является микросервисом обмена данными между фронтендом и микросервисами golos.io.
Также известен как фронтенд-гейт. Использует веб-сокеты с JSON-RPC для общения с клиентами.
Микросервис пробрасывает данные между клиентами и микросервисами, используя роутинг по трем поинтам:
- Идентификатор канала - определяется на этапе подключения пользователя.
Гарантирует что данные поступят конкретному получателю. - Имя пользователя - идентификатор пользователя, определяется автоматически.
Гарантирует что пользователю будут доступны только предназначенные ему данные. Возможен анонимный доступ для некоторых строго определенных методов. - Идентификатор запроса - определяется идентификатором JSON-RPC.
Гарантирует порядок и идентификацию ответов.
Данные внутри формируются в особом формате и переправляются дальше:
{
_frontendGate, // флаг формата фронтенд-гейта
auth: {
user, // имя пользователя
roles, // массив ролей
},
routing: {
requestId, // id запроса (если это JSON-RPC)
channelId, // id канала (WSS)
},
meta: {
clientRequestIp, // ip клиента
},
params, // объект параметров запроса
}
Пользователь обратно получает данные в JSON-RPC формате - это может быть как ответ целевого сервиса, так и ответ с ошибкой на уровне гейта, в случае возникновения оной.
Роутинг и валидация параметров производится на стороне FACADE-SERVICE, гейт занимается лишь переправкой входящих сообщений и более низкоуровневыми вещами. Также гейт занимается авторизацией, о чем детальнее описано ниже.
(Авторизация может быть отключена с помощью переменной окружения: GLS_DISABLE_AUTH)
При подключении сервер сам присылает секрет на подпись в случае, если необходима авторизация при помощи сообщения в веб-сокете.
Далее необходимо отправить на сервер запрос с JSON-RPC методом auth.authorize
и тремя параметрами - user
, secret
и sign
.
user
должен содержать имя пользователя, sign
- сгенерированную подпись, а secret
должен содержать секрет.
В случае успеха текущее подключение будет закреплено за указанным пользователем.
При этом приватный ключ не передается по сети, обеспечивая безопасность авторизации.
Описание API общения с инфраструктурой содержится в документации FACADE-SERVICE т.к. именно он отвечает за роутинг.
Доступное клиентам извне
'auth.generateSecret': // Получить секрет авторизации для подписи
<empty> // Без параметров
<- result: // Варианты ответа
(success): // В случае успеха
secret <string> // Секрет авторизации
<- error: // Варианты ошибок
<shared> // Нет уникальных ошибок
'auth.authorize': // Авторизоваться
user <string> // Имя пользователя
sign <sign> // Подпись пользователя
secret <string> // Строка секрета
<- result: // Варианты ответа
(success): // В случае успеха
status <'OK'> // Прошло успешно
<- error:
1102 // Доступ запрещен, не валидный формат данных авторизации
1103 // Доступ запрещен, блокчейн отверг авторизацию
<shared>:
<- error: // Варианты ошибок
1101 // Доступ запрещен, запрашиваемый метод не входит в разрешенный список
1104 // Ошибка передачи данных микросервису фасаду, вероятно проблема со связью
Доступное внутренним микросервисам
transfer: // Отправить клиенту JSON-RPC нотификацию с данными
channelId <string> // Идентификатор канала
method <string> // Имя JSON-RPC метода
error <Object> // Объект ошибки (нет если result)
result <Object> // Объект результата (нет если error)
<- result: // Варианты ответа
(success): // В случае успеха
status <'OK'> // Прошло успешно
<- error: // Варианты ошибок
1105 // Клиент не был найден, может возникать если соединение с ним было отключено
1106 // Фатальная ошибка, ошибка в коде или непредвиденные критические неполадки с каналом
Возможные переменные окружения ENV
:
-
GLS_FACADE_CONNECT
(обязательно) - адрес подключения к микросервису фасаду. -
GLS_AUTH_CONNECT
(обязательно) - адрес подключения к микросервису авторизации -
GLS_FRONTEND_GATE_HOST
(обязательно) - адрес, который будет использован для входящих веб-сокет подключений клиентов.
Дефолтное значение при запуске без докера -0.0.0.0
-
GLS_FRONTEND_GATE_PORT
(обязательно) - адрес порта, который будет использован для входящих веб-сокет подключений клиентов.
Дефолтное значение при запуске без докера -8080
, пересекается сGLS_GATE_PORT
-
GLS_CONNECTOR_HOST
(обязательно) - адрес, который будет использован для входящих подключений связи микросервисов.
Дефолтное значение при запуске без докера -0.0.0.0
-
GLS_CONNECTOR_PORT
(обязательно) - адрес порта, который будет использован для входящих подключений связи микросервисов.
Дефолтное значение при запуске без докера -8080
, пересекается сGLS_FRONTEND_GATE_PORT
-
GLS_METRICS_HOST
(обязательно) - адрес хоста для метрик StatsD.
Дефолтное значение при запуске без докера -127.0.0.1
-
GLS_METRICS_PORT
(обязательно) - адрес порта для метрик StatsD.
Дефолтное значение при запуске без докера -8125
-
GLS_MONGO_CONNECT
- строка подключения к базе MongoDB.
Дефолтное значение -mongodb://mongo/admin
-
GLS_DAY_START
- время начала нового дня в часах относительно UTC. Дефолтное значение -3
(день начинается в 00:00 по Москве). -
GLS_FRONTEND_GATE_TIMEOUT_FOR_CLIENT
- время, через которе клиент, подключенный по веб-сокету, будет отключен если он не отвечает на пинг запросы или от него не приходят новые входящие запросы.
Дефолтное значение -60000
(1 минута) -
GLS_DISABLE_AUTH
- отключение методов авторизации.
Для запуска достаточно вызвать команду docker-compose up
в корне проекта, предварительно указав необходимые ENV
переменные.