Описание
...
...
Image Modified
Column |
---|
Блок кода |
---|
|
Eltex-doors является сервисом аутентификации, который выполняет проверку подлинности пользователя, созданием созданием токена и верификацией токена. Eltex-doors формирует токен JWT на основе переданного POST-запроса содержащий логин, пароль, а также метаданные. Подсказка |
---|
JWT(JSON Web Token) - JSON-объект, определен в RFC 7519 |
Сгенерированные токены хранятся в БД eltex-doors, таблица auth_token . По истечению, заданного в конфигурационном файле, времени (token.expire.timeout), выполняется очистка устаревших токенов из БД. Для добавления необходимых данных в БД Mysql необходимо установить пакет eltex-doors-db. Параметры "срок действия токена{iat}" и "время создания токена{exp}" указаны в payload токена и . Их можно узнать выполнив декодирование токена.
С версии 1.15 появилась возможность валидировать токены без дополнительного обращения к doors. При установке или обновлении генерируются открый открытый и закрытый ключ, которые по умолчанию размещаются в каталоге /etc/eltex-doors/keys/. Для того, чтобы к приватному ключу имели доступ только доверенные сервисы, ключам назначаются права 440 и принадлежат принадлежность группе eltex: Блок кода |
---|
| -r--r----- 1 root eltex 1704 Sep 19 10:44 private.pem
-r--r----- 1 root eltex 451 Sep 19 10:44 public.pem |
private.pem - ключ необходимый для подписи JWT-токенов. public.pem - ключ необходимый сервисам для валидации JWT-токенов. Если по какой-либо причине необходимо пересоздать ключи, то можно запусить скрипт, который находится в каталоге /usr/share/eltex-doors/gen_keys.sh Предупреждение |
---|
После генерации новых ключей, необходимо ключ public.pem заново передать сервисам |
|
Доступные методы API: /api/signin/
Пример передаваемых параметров в POST запросе
При первом обращении за 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. |
Управление сервисом
...
Способы запуска/остановки
Действие | Команда | Ответ |
---|
Проверка состояния | service eltex-doors status | Сервис запущен Подсказка |
---|
Active: active (running) |
Cервис не запущен Предупреждение |
---|
Active: failed |
|
Запуск сервиса | service eltex-doors start | Сервис успешно запущен Подсказка |
---|
Active: active (running) |
|
Остановка сервиса | service eltex-doors stop | Сервис успешно остановлен
|
Перезапуск сервиса | service eltex-doors restart | Сервис успешно перезапущен Подсказка |
---|
Active: active (running) |
|
Доступные методы AP
Eltex Doors предоставляет следующие методы:
- Метод получения JWT (refresh token и access token) по логину и паролю.
- Метод обновления access token по полученному ранее refresh token.
- Метод инвалидации JWT.
- Метод проверки JWT. Метод устарел и не рекомендуется к использованию.
Получение токенов по логину и паролю
Для получения access и refresh token требуется в Eltex Doors отправить POST-запрос в формате JSON на URL /api/signin
со следующим содержимым:
Section |
---|
Column |
---|
|
Блок кода |
---|
POST http://localhost:9097/api/signin HTTP/1.1
Content-Type: application/json
Accept: application/json
{
"username": "user",
|
|
Column |
---|
- В поле "
username" указывается логин пользователя. - В поле "
password" указывается пароль пользователя. - В поле "
metadata" указываются любые данные, которые должны попасть в JWT.
|
|
Подсказка |
---|
Поле metadata становится опциональным с версии SoftWLC 1.17. |
Пример запроса:
Блок кода |
---|
|
curl -XPOST -H "Content-type: application/json" -d '{"username": "nasIpuser", "password": "100.112.0.1",
"sessionId": "5692549928996308667",
"vrf": "1",
"clientMac": "FC-45-96-5F-50-AC"
}
}password"}' 'http://localhost:9097/api/signin/' |
- В случае успеха, сервис ответит:
Section |
---|
Column |
---|
|
Блок кода |
---|
| {
"status": "OK",
"accessToken": "eyJhbGc...",
"refreshToken": "eyJhb..."
} |
|
Column |
---|
"status" - статус ответа; "accessToken" - сгенерированный токен. |
|
- В случае ошибки, сервис ответит:
Section |
---|
Column |
---|
|
Блок кода |
---|
| {"status":"FAIL","error":"Invalid username or password"} |
|
Column |
---|
Section |
---|
"status" - статус ответа; "error" - описание ошибки. |
|
|
Отзыв токенов
Полученный ранее 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...",
"accessTokenrefreshToken": "eyJhbGciOiJIUzI1NiJ9eyJhb.eyJzdWIiOiJ1c2VyIiwiYXV0aCI6WyJST0xFX0FETUlOIl0sImlhdCI6MTU1OTcwOTQ2OCwiZXhwIjoxNTU5NzgxNDY4LCJuYXNJcCI6IjEwMC4xMTIuMC4xIiwic2Vzc2lvbklkIjoiNTY5MjU0OTkyODk5NjMwODY2NyIsInZyZiI6IjEiLCJjbGllbnRNYWMiOiJGQy00NS05Ni01Ri01MC1BQyJ9.VQ1NKCcG445eSMz7jOoTGt7PC1HVhTkFxxwWWxdVO3Y."
} |
где, status - статус ответа
accessToken - сгенерированный токен
- В случае ошибки, сервис ответит, если токен уже не валиден или неправильный:
Блок кода |
---|
|
{
"status": "FAIL",
"error":"Invalid username or password"} |
где, status - статус ответа
error - описание ошибки
Конфигурация
...
Конфигурация
...
/etc/eltex-doors/application.conf
Основной конфигурационный файл.
Блок кода |
---|
language | yml |
---|
title | /etc/eltex-doors/application. |
---|
|
...
|
noformat | ## |
# Mysql datasource properties
spring.datasource.url=jdbc:mysql://<<ip_address>>:3306/eltex_doors?useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=eltexdoors Логин
spring.datasource.password=eltexpassword Пароль
spring.flyway.url=jdbc:mysql://localhost:3306/eltex_doors?useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.flyway.user=eltexdoors Логин
spring.flyway.password=eltexpassword Пароль
## Eureka settings and starting server port
server.port=9097 Порт, который слушает сервис
## Custom application properties
## Token expiration timeout
# Use time format HH:mm:ss
auth.cron.session.timeout=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 * * * * * Период"
проверки
жизни токена
auth.token.expire.timeout=20:00:00 Время жизни токена
# Login and password from basic account
auth.username=user Логин, для подключения к eltex-doors
auth.password=password Пароль, для подключения к eltex-doors
# Auth keys paths
auth.private.key= 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-service:
Без форматирования |
---|
auth {
username = user
password = password
} |
Без форматирования |
---|
keys {
private = /etc/eltex-doors/keys/private.pem
Приватныйpublic ключ, с помощью которого подписывается JWT токен
auth.public.key== /etc/eltex-doors/keys/public.pem Открытый ключ, для валидации JWT |
...
- Время очистки БД от просроченных токенов:
Без форматирования |
---|
clearTimeout = "*/60 * * * * *" |
Без форматирования |
---|
lifetime {
access = 15m
refresh = 30d
} |
/etc/default/eltex-doors
Файл настройки инициализации сервиса.
Блок кода |
---|
title | /etc/default/eltex-doors |
---|
|
noformat |
# AP Monitoring service
# HTTP Port for use by Eltex Doors
PORT=9097
# Initial size of Java heap
JAVA_INIT_HEAP=8m Количество ОЗУ выделяемой при инициализации
32m
# Maximum size of Java heap
JAVA_MAX_HEAP=64m Количество ОЗУ выделяемой при работе
# 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 |
- Дополнительные опции запуска java:
Без форматирования |
---|
# Additional arguments to pass to java
JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/eltex-doors"
|
/etc/eltex-doors/log4j2.xml
Файл настройки логирования.
Блок кода |
---|
language | xml |
---|
title | /etc/eltex-doors/log4j2.xml |
---|
collapse | true |
---|
|
<?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> |
- Блок настройки перенаправления логов в Graylog (уровень логирования, адрес, порт):
Без форматирования |
---|
<Property name="gelfLevel">OFF</Property>
<Property name="gelfHost">udp:lab3-test.eltex.loc</Property>
<Property name="gelfPort">12201</Property> |
Без форматирования |
---|
<Property name="rootLevel">DEBUG</Property> |