Использование программного компонента#

Как правило, разработчик не использует проксирование непосредственно при разработке и интеграции с сервисом идентификации и аутентификации, но может использовать некоторые артефакты аутентификации и идентификации, производимые провайдером идентификации и используемые IAM Proxy в ходе своего нормального функционирования. При использовании проксирования через IAM Proxy и при использовании mTLS на подключениях к серверам приложения, проверка подписи JWT-токена и его срока действия не является необязательной. Однако данную проверку рекомендуется производить. Разработчику приложения следует ориентироваться на состав JWT-токена с конкретного региона(могут быть небольшие отличия в зависимость от региона) при проектировании механизмов аутентификации и авторизации своего приложения. Ниже приводится пример передаваемого JWT-токена и описание его полей.

{
	"alg" : "RS256",
	"typ" : "JWT",
	"kid" : "QQQGMpFRIhaR1HDeJNIVRrEmUK14AgR_sz_rg-5kjvU"
}{
    "exp": 1623917687,
    "iat": 1623917387,
    "jti": "b986ddb6-d96e-400d-8b09-64f217ea98a6",
    "iss": "https://auth.my.company.ru/auth/realms/CustomerA",
    "aud": [
        "CustomerA:Project1",
        "CustomerA:Project2"
    ],
    "sub": "6608179f-9f7f-4154-922f-f541c7448e6e",
    "typ": "Bearer",
    "azp": "CustomerA:IAMProxy",
    "session_state": "aed58344-610d-4d09-b241-5db0193e2ad5",
    "acr": "1",
    "resource_access": {
        "CustomerA:Project1": {
            "roles": [
                "JustUser"
            ]
        },
        "CustomerA:Project2": {
            "roles": [
                "AppRoleC",
                "AppRoleB"
            ]
        }
    },
    "scope": "email profile",
    "email_verified": false,
    "preferred_username": "ivanov-ii"
}
    

Cодержимое токена приведено в качестве примера, и может не соответствовать по наполнению с реальными токенами.

Блок

Параметр

Описание

Пример

Header

alg

Алгоритм, который использовался для подписания токена HS256 (HMAC с SHA-256) - это симметричный алгоритм шифрования с одним (секретным) ключом, который разделяется между авторизационным сервисом и клиентским сервисом. Поскольку один и тот же ключ используется как для генерации подписи, так и для проверки подписи, необходимо следить за тем, чтобы ключ не был скомпрометирован. RS256 (подпись RSA с SHA-256) является симметричный алгоритм, использует пару открытый/закрытый ключ: сервис авторизации имеет закрытый ключ, используемый для генерации подписи, а клиентские сервисы хранят открытый ключ, используемый для проверки подписи. Поскольку открытый ключ, в отличие от закрытого ключа, не должен быть защищен, большинство поставщиков удостоверений делают его доступным для потребителей для получения и использования (обычно через URL метаданных). Возможны также данные алгоритмы с размером ключа в 384 и 512 бит (RS512 …).

RS256

typ

Тип формата токена

JWT

kid

ID открытого ключа для проверки подписи

QQQGMpFRIhaR1HDeJNIVRrEmUK14AgR_sz_rg-5kjvU

Playload

jti

JWT ID Claim - уникальный идентификатор токена

9d4cd7be-320a-4ee7-b8b8-15623c0ba4dd

typ

Тип токена

ID

exp

Срок действия токена (тип NumericDate)

1586514237

nbf

Not Before Claim – Срок, ДО которого токен НЕ может быть использован (тип NumericDate)

0

iat

Not Before Claim – Время выдачи токена (тип NumericDate)

1586513637

iss

Issuer Claim - идентификатор издателя токена

https://mycompany-auth.mycompany.ru/auth/realms/PlatformAuth

azp

Получатель, сторона которая запросила токен (содержит client id)

PlatformAuth-Proxy

sub

Subject Claim - идентификатор назначения токена, содержит ID УЗ пользователя

739edb6e-b9b5-4ec5-9731-2e37de8d6327

aud[]

Audience Claim - определяет получателей, для которых предназначен токен

[ "PlatformAuth-Proxy", "PlatformAuthZ" ]

nonce

Строковое значение, используемое для связывания сеанса клиента с TokenID

64ac9d64d2b2b31167ab02015ae75d4e

auth_time

Время когда была произведена аутентификация (тип NumericDate)

1586513637

session_state

Идентификатор сессии пользователя

e281c489-b28b-4213-95a5-e6985071b69c

acr

Уровень, достаточный для идентификации

1

realm_access.roles[]

Набор разрешений для работы с консолью

"roles" : ["EFS_APPLICATION_ADMIN","platformauth_admin","uma_authorization"]

preferred_username

Логин пользователя

test_admin

Sign

Подпись токена на закрытом ключе с использованием алгоритма из поля alg , в формате base64. EncodeToBase64(SHA256withRSA(unsignedToken, SECRET_KEY))

Zwbmz3zFMqixJMbuuG9FS9OTqThG1FWHND1…

Примечание: NumericDate - количество секунд с 1 января 1970 года 00:00:00 UTC

проверка токена при авторизации#

  1. Проверка подписи по открытому ключу kid;

  2. Выдан доверенной стороной iss;

  3. Валидность по времени iat/exp;

  4. Наличия имени/id проверяющей системы в поле aud.