Настройки задаются переменными окружения и двумя JSON-файлами: списком OIDC-клиентов и конфигурацией внешнего провайдера (ЕСИА). Ключ подписи токенов (RSA, PEM) задаётся переменной KEY.
Обязательные переменные
Пути к файлам конфигурации задаются переменными окружения службы:
| Переменная | Значение |
|---|---|
EXTIDP | путь к файлу конфигурации внешнего провайдера extidp.json |
CLIENTS | путь к файлу доверенных OIDC-клиентов clients.json |
EXTIDP=/opt/esia-idp/config/extidp.json CLIENTS=/opt/esia-idp/config/clients.json
Без этих файлов служба не запускается. По умолчанию используются extidp.json и clients.json в рабочем каталоге службы.
Переменные окружения
| Переменная | По умолчанию | Описание |
|---|---|---|
DEBUG | false | режим отладки: в журнал выводится дополнительная информация |
LOG_LEVEL | info (debug, если DEBUG=true) | уровень журнала: error, warn, info, debug |
ISSUER | http://localhost:4010 | уникальный идентификатор провайдера |
BASE_URL | http://localhost:4010 | URL, по которому развёрнут сервис |
HOST | 0.0.0.0 | интерфейс, который слушает сервис |
PORT | 4010 | порт, который слушает сервис |
KEY | key.pem | путь к файлу приватного ключа RSA (PEM) для подписи JWT, выдаваемых клиентам |
FORCE_PKCE | true | принимать запросы аутентификации только с PKCE |
CLIENTS | clients.json | путь к файлу OIDC-клиентов |
EXTIDP | extidp.json | путь к файлу настроек внешнего IdP |
EXTIDP_REQUEST_TTL | 1h | время жизни запроса к внешнему IdP |
EXTIDP_REQUEST_CLEAN_UP | 1h | интервал очистки запросов к внешнему IdP |
USERINFO_TTL | 1h | время жизни информации о пользователе |
USERINFO_CLEAN_UP | 1h | интервал очистки информации о пользователях |
CODE_TTL, TOKEN_TTL | 1h | время жизни кода авторизации и токена доступа; для кода рекомендуется 5m–10m |
TOKEN_CLEAN_UP | 10m | интервал очистки устаревших кодов и токенов |
TOKEN_CLEAN_UP_LIMIT | 1000 | предельное число кодов и токенов, удаляемых за один интервал очистки |
SESSION_COOKIE_NAME | sid | имя cookie сессии |
SESSION_COOKIE_LIFETIME | 3600 | время жизни cookie сессии, секунды |
SESSION_COOKIE_SECURE | true | передавать cookie только по защищённому соединению |
SESSION_EXPIRED | 3600 | время жизни сессии, секунды |
CPROCSP_BIN_DIR | /opt/cprocsp/bin/amd64 | каталог исполняемых файлов КриптоПро CSP |
GEN_GUIDS_BIN_PATH | /opt/avanpost/esia-adapter/genguids | путь к утилите genguids |
GEN_GUIDS_BATCH_SIZE | 50 | число идентификаторов, генерируемых за один вызов genguids |
GEN_GUIDS_SEPARATOR | \r | разделитель идентификаторов в выводе genguids |
NODE_ID | пусто | необязательный идентификатор узла: возвращается в JWT и используется балансировщиком |
DB_URL | пусто | необязательный URL подключения к базе данных |
CORRUPTION_CHECK_INTERVAL | 15m | интервал проверки КриптоПро CSP |
CORRUPTION_CHECK_CONTAINER | пусто | контейнер для проверки КриптоПро CSP |
CORRUPTION_CHECK_PIN | пусто | пароль контейнера для проверки КриптоПро CSP |
CORRUPTION_CHECK_CERT | пусто | путь к сертификату для проверки КриптоПро CSP |
CORRUPTION_CHECK_ALG | GOST3410_2012_256 | алгоритм сертификата для проверки КриптоПро CSP |
Пример:
{
"DEBUG": "false", "BASE_URL": "https://esia-adapter.corp:4010",
"HOST": "0.0.0.0", "PORT": 4010, "KEY": "key.pem",
"CLIENTS": "/opt/esia-idp/config/clients.json", "EXTIDP": "/opt/esia-idp/config/extidp.json",
"EXTIDP_REQUEST_TTL": "1h", "USERINFO_TTL": "1h",
"SESSION_COOKIE_NAME": "sid", "SESSION_COOKIE_LIFETIME": 3600,
"SESSION_COOKIE_SECURE": "true", "SESSION_EXPIRED": 3600,
"CPROCSP_BIN_DIR": "/opt/cprocsp/bin/amd64"
}
clients.json — доверенные OIDC-клиенты
[
{ "ID": "pkce-only-client", "Domain": "localhost:9094" },
{ "ID": "client-with-secret", "Secret": "<секрет>", "Domain": "example.com" }
]
ID— идентификатор клиента.Secret— секрет клиента; клиент безSecretработает только с PKCE.Domain— хост для проверкиredirect_uriклиента.
Конфигурация внешнего провайдера (ЕСИА)
Готовый JSON можно взять в административной консоли Avanpost FAM 1.16 или, для более ранних версий, из DevTools браузера при просмотре настроек внешнего IdP. Значение synonym должно быть равно esia. Три готовых шаблона в поставке: extidp.esia.v1.example.json (API ЕСИА v1), extidp.esia.v2.example.json (v2) и extidp.esia.v2.pkce.example.json (v2 с PKCE).
Основные поля провайдера: id, type (всегда esia), name, synonym (всегда esia), authorizeUri, redirectMethod (0 — редирект 307, 1 — HTML-форма), logoutUri, logoutForm, typeDetails, redirectForm, userInfoPipeline, attrMapping, isActive.
typeDetails— строка с JSON:baseUrlЕСИА,clientID(мнемоника ИС),cryptoProvider(cprocsp_cmsдля API v1,cprocsp_rawдля API v2),scope,scopeOrg. Значения доступны в шаблонах как.extidp_details.<поле>.redirectForm— параметры, отправляемые в ЕСИА при запросе аутентификации.userInfoPipeline— шаги получения данных о пользователе. Тип шагаt:0— HTTP-запрос,1— шаблон Go,2— JavaScript (лимит времени 10 с).r— имя переменной результата,d— данные,m/u/h— метод, адрес, заголовки.attrMapping— отображение данных, полученных от ЕСИА, в атрибуты пользователя, которые адаптер передаёт приложению. Подробнее — в разделе «Атрибуты пользователя (attrMapping)» ниже.
Атрибуты пользователя (attrMapping)
В attrMapping для каждого атрибута задаётся шаблон Go. Адаптер выполняет шаблон после завершения шагов userInfoPipeline; в шаблоне доступны все переменные, сохранённые шагами (поле r), например {{.person.firstName}} или {{.main_email}}. Результат — строка, которая записывается в атрибут. Пустой шаблон оставляет атрибут пустым, пустые атрибуты в ответ не включаются. Ошибка выполнения шаблона прерывает вход.
| Поле | Название | Что означает |
|---|---|---|
fn | first name | имя пользователя |
ln | last name | фамилия |
mn | middle name | отчество |
un | username | логин пользователя |
e | адрес электронной почты | |
p | phone | номер телефона |
l | language | язык пользователя |
xid | external id | идентификатор пользователя во внешней системе (в ЕСИА — oid); по нему приложение связывает вход с учётной записью |
x | extra | дополнительные атрибуты: словарь «имя атрибута → шаблон значения». Имя и состав задаются произвольно, значения только строковые (СНИЛС, ИНН, признак доверенной УЗ, число документов и т.д.) |
rid | request id | служебное поле: имя параметра ответа ЕСИА, из которого адаптер берёт идентификатор запроса и находит по нему запрос аутентификации. Для ЕСИА всегда state |
Пример:
"attrMapping": {
"fn": "{{.person.firstName}}",
"ln": "{{.person.lastName}}",
"mn": "{{.person.middleName}}",
"e": "{{.main_email}}",
"p": "{{.main_phone}}",
"xid": "{{printf \"%.0f\" .id_token_claims.sub}}",
"rid": "state",
"x": { "snils": "{{.snils}}", "inn": "{{.inn}}" }
}
Куда попадают атрибуты. Значения (кроме rid) собираются в объект userinfo, который адаптер:
- помещает в выдаваемый приложению
id_tokenв claimuserinfo(fn,ln,mn,un,e,p,l,xid,x); - отдаёт приложению в ответе
/oauth2/userinfo.
Структура userinfo
Все поля необязательные и строковые; незаполненные поля не передаются.
| Поле | Тип | Источник в attrMapping |
|---|---|---|
fn | строка | fn |
ln | строка | ln |
mn | строка | mn |
un | строка | un |
e | строка | e |
p | строка | p |
l | строка | l |
xid | строка | xid |
x | объект «имя → строка» | x |
Пример claim userinfo в id_token и ответа /oauth2/userinfo:
{
"fn": "Иван",
"ln": "Иванов",
"mn": "Иванович",
"e": "ivanov@example.com",
"p": "+7(900)0000000",
"xid": "1000123456",
"x": { "snils": "123-456-789 00", "inn": "770000000000" }
}
Данные хранятся в памяти адаптера в течение USERINFO_TTL. Идентификатор пользователя в claim sub — служебный идентификатор записи адаптера, он не равен идентификатору в ЕСИА; для связи с учётной записью применяется xid.
Функции шаблонов
join, fail (прервать вход с ошибкой), base64, debase64, timeFormat, emailUsername, cryptoSign, cryptoVerify, cryptoVerifyJWT, cryptoHashSum. В JavaScript-шагах доступна jwt(token).
Эндпоинты
См. Справочник.