Eltex-doors является сервисом аутентификации, который выполняет проверку подлинности пользователя, созданием токена и верификацией токена. Eltex-doors формирует токен JWT на основе переданного POST-запроса содержащий логин, пароль, а также метаданные.
Сгенерированные токены хранятся в БД Параметры "срок действия токена{iat}" и "время создания токена{exp}" указаны в payload токена. Их можно узнать выполнив декодирование токена. С версии 1.15 появилась возможность валидировать токены без дополнительного обращения к doors. При установке или обновлении генерируются открытый и закрытый ключ, которые по умолчанию размещаются в каталоге /etc/eltex-doors/keys/. Для того, чтобы к приватному ключу имели доступ только доверенные сервисы, ключам назначаются права 440 и принадлежность группе eltex:
private.pem - ключ необходимый для подписи JWT-токенов. public.pem - ключ необходимый сервисам для валидации JWT-токенов. Если по какой-либо причине необходимо пересоздать ключи, то можно запусить скрипт, который находится в каталоге /usr/share/eltex-doors/gen_keys.sh
При первом обращении за JWT к Doors, сервис выдаёт два токена: access и refresh. Access token имеет короткий срок жизни и используется непосредственно для доступа к сервисам. Refresh token же живёт значительно дольше и используется только для получения нового access token. Такая схема позволяет быстро прекратить доступ к ресурсам в случае утечки access token. Срок жизни токенов определяется в файле конфигурации сервиса Eltex Doors и по умолчанию составляет 15 минут для access и 30 дней для refresh. По истечении срока жизни access token внешний сервис должен будет обратиться к Eltex Doors за новым access token, предъявив при этом refresh token. |
Для работы сервиса необходима установка схемы на сервер БД:
apt install eltex-doors-db |
Установка сервиса:
apt install eltex-doors |
Действие | Команда | Ответ | ||
---|---|---|---|---|
Проверка состояния | service eltex-doors status | Сервис запущен
Cервис не запущен
| ||
Запуск сервиса | service eltex-doors start | Сервис успешно запущен
| ||
Остановка сервиса | service eltex-doors stop | Сервис успешно остановлен
| ||
Перезапуск сервиса | service eltex-doors restart | Сервис успешно перезапущен
|
Eltex Doors предоставляет следующие методы:
Получение токенов по логину и паролю
Для получения access и refresh token требуется в Eltex Doors отправить POST-запрос в формате JSON на URL /api/signin
со следующим содержимым:
|
Поле metadata становится опциональным с версии SoftWLC 1.17. |
Пример запроса:
curl -XPOST -H "Content-type: application/json" -d '{"username": "user", "password": "password"}' 'http://localhost:9097/api/signin/' |
|
|
Полученный ранее refresh token можно отозвать. Для этого нужно отправить запрос на URL /api/signout
, добавив заголовок авторизации.
POST http://localhost:9097/api/signout HTTP/1.1 Accept: application/json Authorization: Bearer eyJhb... |
Пример запроса:
curl -XPOST -H "Authorization: Bearer eyJhb..." 'http://localhost:9097/api/signout/' |
{ "status": "OK", "accessToken": "Logged out", "refreshToken": null } |
{ "status": "FAIL", "error":"Invalid JWT" } |
Для обновления access token нужно отправить запрос на /api/signin/token
с заголовком авторизации:
POST http://localhost:9097/api/signin/token HTTP/1.1 Accept: application/json Authorization: Bearer eyJhb... |
Пример зарпроса:
curl -XPOST -H "Authorization: Bearer eyJhbGc..." 'http://100.110.1.222:9097/api/signin/token/' |
{ "status": "OK", "accessToken": "eyJhbGc...", "refreshToken": "eyJhb..." } |
{ "status": "FAIL", "error":"Invalid JWT" } |
Основной конфигурационный файл.
# Mysql datasource properties database { host = localhost port = 3306 name = eltex_doors user = eltexdoors password = eltexpassword pool { # Time to wait for a connection connectionTimeout = 10s # Time to wait for connection validation validationTimeout = 3s min = 1 max = 5 } } # Basic account credentials auth { username = user password = password } # Authentification keys paths keys { private = /etc/eltex-doors/keys/private.pem public = /etc/eltex-doors/keys/public.pem } # Tokens lifetime tokens { clearTimeout = "*/60 * * * * *" lifetime { access = 15m refresh = 30d } } |
database { host = localhost port = 3306 name = eltex_doors user = eltexdoors password = eltexpassword ... |
connectionTimeout = 10s |
validationTimeout = 3s |
min = 1 max = 5 |
auth { username = user password = password } |
keys { private = /etc/eltex-doors/keys/private.pem public = /etc/eltex-doors/keys/public.pem } |
clearTimeout = "*/60 * * * * *" |
lifetime { access = 15m refresh = 30d } |
Файл настройки инициализации сервиса.
# AP Monitoring service # HTTP Port for use by Eltex Doors PORT=9097 # Initial size of Java heap JAVA_INIT_HEAP=32m # Maximum size of Java heap JAVA_MAX_HEAP=256m # Additional arguments to pass to java JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/eltex-doors" |
# HTTP Port for use by Eltex Doors PORT=9097 |
# Initial size of Java heap JAVA_INIT_HEAP=32m |
# Maximum size of Java heap JAVA_MAX_HEAP=256m |
# Additional arguments to pass to java JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/eltex-doors" |
Файл настройки логирования.
<?xml version="1.0" encoding="UTF-8"?> <Configuration monitorInterval="600"> <Properties> <Property name="rootLevel">DEBUG</Property> <Property name="baseDir">/var/log/eltex-doors</Property> <Property name="maxFileSize">5 MB</Property> <Property name="accumulatedFileSize">100 MB</Property> <Property name="lastModified">7d</Property> <Property name="maxCount">10</Property> <Property name="logPattern">%d{ISO8601} [%t] %-5p %logger{1} %C{1}.%M(line:%L). %m%n</Property> <Property name="consoleLevel">${env:CONSOLE_LEVEL:-OFF}</Property> <Property name="gelfLevel">${env:GELF_LEVEL:-OFF}</Property> <Property name="gelfHost">${env:GELF_HOST:-udp:lab3-test.eltex.loc}</Property> <Property name="gelfPort">${env:GELF_PORT:-12201}</Property> </Properties> <Appenders> <Console name="STDERR" target="System.err"> <PatternLayout pattern="${logPattern}"/> </Console> <RollingFile name="RollingFile" fileName="${baseDir}/doors.log" filePattern="${baseDir}/log/doors-%i.log.gz"> <PatternLayout pattern="${logPattern}"/> <Policies> <SizeBasedTriggeringPolicy size="${maxFileSize}"/> <OnStartupTriggeringPolicy/> </Policies> <DefaultRolloverStrategy max="${maxCount}"> <Delete basePath="${baseDir}" maxDepth="3"> <IfFileName glob="*/doors-*.log.gz"> <IfAny> <IfAccumulatedFileSize exceeds="${accumulatedFileSize}"/> <IfLastModified age="${lastModified}"/> </IfAny> </IfFileName> </Delete> </DefaultRolloverStrategy> </RollingFile> <Gelf name="Gelf" host="${gelfHost}" port="${gelfPort}" version="1.1" facility="eltex-doors" extractStackTrace="true" originHost="%host{fqdn}" maximumMessageSize="8192"> <Field name="thread" pattern="%t"/> <Field name="level" pattern="%level"/> <Field name="severity" pattern="%-5level"/> <Field name="logger" pattern="%logger{1}"/> <Field name="location" pattern="%C{1}.%M(line:%L)"/> </Gelf> </Appenders> <Loggers> <Root level="${rootLevel}"> <AppenderRef ref="RollingFile"/> <AppenderRef ref="STDERR" level="${consoleLevel}"/> <AppenderRef ref="Gelf" level="${gelfLevel}"/> </Root> <Logger name="org.eltex.softwlc.doors" level="INFO"/> <Logger name="org.springframework" level="ERROR"/> <Logger name="org.eclipse.jetty" level="ERROR"/> <Logger name="com.zaxxer" level="ERROR"/> </Loggers> </Configuration> |
<Configuration monitorInterval="600"> |
<Property name="baseDir">/var/log/eltex-doors</Property> |
<Property name="maxFileSize">5 MB</Property> |
<Property name="accumulatedFileSize">100 MB</Property> |
<Property name="lastModified">7d</Property> |
<Property name="maxCount">10</Property> |
<Property name="gelfLevel">OFF</Property> <Property name="gelfHost">udp:lab3-test.eltex.loc</Property> <Property name="gelfPort">12201</Property> |
<Property name="rootLevel">DEBUG</Property> |