Доверительная аутентификация

Предупреждение

Данный вид аутентификации доступен только для Компаний-Партнеров Удостоверяющего Центра.

Компания-Партнер Удостоверяющего Центра – это организация, которая имеет у себя аккредитованное рабочее место Удостоверяющего центра. Она самостоятельно может удостоверить личность пользователя, проверить документы и создать запрос на сертификат.

Взаимодействовать с продуктами Контура Компании-Партнеры могут с помощью доверительной аутентификации:

  • она позволяет получить Access Token, используя аутентификацию пользователя в доверенной системе Компании-Партнера;

  • её можно выполнить в один запрос. Для этого доверенная система формирует JWT токен и передает его OpenID Провайдеру.

Получение Access Token

Для получения Access Token в запросе POST tokenendpoint нужно предать в параметре token JWT токен с информацией о пользователе.

Метод: POST tokenendpoint

Параметры тела запроса:

Content-Type: application/x-www-form-urlencoded

  • client_id – сервисное имя, выдается вместе с api-key;

  • client_secret – api-key;

  • grant_type – тип аутентификации. Укажите значение: trusted;

  • scope – область действия токена. Укажите значение: extern.api;

  • token – JWT токен с информации о пользователе. JWT токен доверенная система должна сформировать на своей стороне. Подробнее в документации OpenID Connect в разделе Доверительная аутентификация.

Требования к JWT токену

  • Токен можно использовать только 1 раз.

  • Общее время жизни токена не должно превышать 24 часов.

  • Размер значения клейма jti (идентификатор токена) не должен превышать 36 байт.

  • Издатель токена (iss) должен совпадать с clientId сервиса, инициирующего запрос.

  • Обязательные клеймы, которые должны присутствовать в токене:

    • exp – время истечения токена в unix time stamp.

    • sub – идентификатор пользователя во внешней системе.

    • jti – уникальный идентификатор токена.

    • iss – издатель токена, т.е. сервис, желающий получить аутентификацию пользователя.

Токен должен быть подписан ключом или сертификатом доверенной системы. Допускается использование криптографии RSA. Сертификат и ключ для данного алгоритма криптографии можно получить, например, в ОС Windows с использованием OpenSSL.

В JWT токене обязательно в клейме sub передавать тот идентификатор, который указывали при связывании пользователей в параметре ServiceUserId.

Пример генерации JWT с использованием библиотеки jwt.io и RSA сертификата.

{
    X509Certificate2 certificate;

    certificate = new X509Certificate2(@"C:\PathToCertificate\certificate.pfx", "123");
    var internalUserId = "0a9b268a-063b-4e3a-8ad3-4a9a61a2303b"; //любой идентификатор, который был передан для связывания пользователей
    var internalTokenId = Guid.NewGuid().ToString();

    // NuGet-пакет System.IdentityModel.Tokens.Jwt

    var claims = new ClaimsIdentity(new[]
    {
        new Claim("sub", internalUserId), // идентификатор пользователя в доверенной системе
        new Claim("jti", internalTokenId) // идентификатор токена в доверенной системе. должен меняться при каждом запросе, произвольная строка
    });

    var tokenDescriptor = new SecurityTokenDescriptor
    {
        Subject = claims,
        Issuer = clientId, // имя доверенной системы == сервисное имя, выданное вместе с api-key
        Expires = DateTime.UtcNow.AddMinutes(5), // время прекращения действия токена
        SigningCredentials = new X509SigningCredentials(certificate) // сертификат
    };

    var tokenHandler = new JwtSecurityTokenHandler();
    var token = tokenHandler.CreateToken(tokenDescriptor);
    jwtTokenString = tokenHandler.WriteToken(token); // преобразование в формат header.payload.sign

    var jwt = new JwtSecurityToken(jwtTokenString);
    var v = jwt.ToString();
}

Пример доверительной аутентификации

Пример запроса POST tokenendpoint с доверительной аутентификацией

POST https://identity.testkontur.ru/connect/token

Request Headers

Accept: */*
Host: identity.testkontur.ru
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 860

Request Body

client_id:extern.api
client_secret:*****
grant_type:trusted
scope:extern.api
token:eyJhbGciOiJSUzI1NiIsImtpZCI6IjA2RDkwRTg3RTUzREE5QkQzNjIxQjRFQkZGQUY1REFCNkI2NTBDRTMiLCJ4NXQiOiJCdGtPaC1VOXFiMDJJYlRyXzY5ZHEydGxET00iLCJ0eXAiOiJKV1QifQ.eyJzdWIiOiIwYTliMjY4YS0wNjNiLTRlM2EtOGFkMy00YTlhNjFhMjMwM2IiLCJqdGkiOiIxMmVkMWU1NC0xYjIzLTQzODctODJlNS0xZDEzYmNhNGQ4NjYiLCJuYmYiOjE2MDA3NzcxMzMsImV4cCI6MTYwMDc3NzQzMywiaWF0IjoxNjAwNzc3MTMzLCJpc3MiOiJLZUFwaS5UcnVzdGVkLlNlcnZpY2UifQ.UO4-9OzWj14WTjct1E2_SpB7pfaAdPlTu9r_ocNt9bgfeyMxZuFcfWeWTJd5PpdDQA1vXV1EccMO14Qojry0KawJrZVRC2sXZPwrmF0j0v7vK1prnlabaYBsSeO-1vY0EaboIC3Zr5Igw_4xK8R22e4ysY6TS7gBaSQpGF1yjRCB3I6OWPCSWcj81g8GWTiqkuxAgmkMBO6loHrNqdAeG8b-cMt5ycdA9PeFEjeeMZ3F2-A-CWw92OgfqVKgokrfotjnvpdIVZfQC6mCxvYuI4zhEGO_Qz9s_RgbZHifuKmUc89aZROHmEuzh3PHYP25PQ-2-3NzNLyBfF7b6ZJgXg

Пример ответа POST tokenendpoint

HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: no-store, no-cache, max-age=0
Pragma: no-cache
X-Kontur-Trace-Id: 5ea7d9c5570c41cb966c9f7af263b2a8
Context-Globals: FwAAAHZvc3Rvay5yZXF1ZXN0LnByaW9yaXR5CAAAAE9yZGluYXJ5FgAAAHZvc3Rvay50cmFjaW5nLmNvbnRleHRJAAAANWVhN2Q5YzUtNTcwYy00MWNiLTk2NmMtOWY3YWYyNjNiMmE4OzJhN2ZjMWRiLTdjNzQtNGVmMy1hMzg2LTJiYWVhNmQ5MWUyOA==
X-Kontur-Dont-Retry: True
Dont-Retry: True

Response Body

Content-Encoding: gzip
{
    "access_token":"a126187d9c71984e2b979ab7008cb16f124d97bbe9c256f7081dec3eedc2601f",
    "expires_in":86400,
    "token_type":"Bearer"
}