B2BB2CH2H

Проверка подписи

Проверить подпись можно для трех сущностей:

  • •
    id_token;
  • •
    access_token;
  • •
    userinfo.

Партнёр API получает ответ в формате сформированного токена JWS, который состоит из:

  • •
    Заголовка (Header), содержащего алгоритм подписи, идентификатор ключа и тип токена;
  • •
    JSON-объекта (Payload), в котором перечислены клэймы полезной нагрузки;
  • •
    Электронной подписи (Signature), содержащей подпись данных секретным ключом, парным открытому ключу, выпущенному для Alfa ID.
Декодирование компактной сериализации JWS

JWS формируется из трех составляющих и представляет структуру вида:

  • •
    Base64URL(Header);
  • •
    Base64URL(Payload);
  • •
    Base64URL(Signature).
Пример access_token
Закодированный Раскодированный
eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiIzMjI4ZTY4ZS1jYzM0LTRiODItYjQzZC00OTExMmI1ZDlkM2UiLCJhdWQiOiIwY2VlMDY4My04NWFlLTQ5ZjItYTYzZC0yOWY5N2FhZDE5MTEiLCJpc3MiOiJodHRwczpcL1wvaWQuYWxmYWJhbmsucnUiLCJleHAiOjE2MzE2NjY2NjMsInNjb3BlX3NlcnZpY2VzIjpbInBheW1lbnQiLCJzdGF0ZW1lbnQiXSwiaWF0IjoxNjMxNjYzMDYzLCJzY29wZV9jbGFpbXMiOlsibmFtZSIsImdpdmVuX25hbWUiLCJmYW1pbHlfbmFtZSIsIm1pZGRsZV9uYW1lIiwiZW1haWwiLCJwaG9uZV9udW1iZXIiXX0.WVr5xkQSEGqpPXN3aIo0zHZLDL0vvtxEEQ83BrgJo7l0BjjALeGDRYENF2bL8j3n1pXRnduiBQcYNV6teBhESI8V_8kd7Kh7LTePkJWadPSvD__KskC69b4XZ-zN-IQ73NmAcBDStnnhSXGKL6xhdRy-TGiAoKPsRWiDVntsDlpCQNHAt3tJk8q_SQS4S1k6qju9eJ2GFkgmd6z8rR2vaBykaOF0K61ltksw6YgXhuek3OlYkqIAivyKYl59uio8zMpJk-YrPlmawwmvWPF0vKhaLj8Mvn4mVMsVSfuVVKP2ksHG0MAlWpO3Sh9GoKO4d6TQplJ4vgIIeNx-44npqw
header
{
  "kid": "alfa-test-jwt",
  "typ": "JWT",
  "alg": "RS256"
}
payload
{
  "sub": "3228e68e-cc34-4b82-b43d-49112b5d9d3e",
  "aud": "0cee0683-85ae-49f2-a63d-29f97aad1911",
  "iss": "https://id.alfabank.ru",
  "exp": 1631666663,
  "scope_services": [
    "payment",
    "statement"
  ],
  "iat": 1631663063,
  "scope_claims": [
    "name",
    "given_name",
    "family_name",
    "middle_name",
    "email",
    "phone_number"
  ]
}
signature
RSASHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),

  your-256-bit-secret
) // secret base64 encoded
Пример JWS идентификационного токена id_token

Каждая часть, разделённая точкой, должна декодироваться отдельно, с использованием алгоритма Base64URL Encoding.

Закодированный Раскодированный
eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ .eyJzdWIiOiIzMjI4ZTY4ZS1jYzM0LTRiODItYjQzZC00OTExMmI1ZDlkM2UiLCJhdWQiOiIwY2VlMDY4My04NWFlLTQ5ZjItYTYzZC0yOWY5N2FhZDE5MTEiLCJhY3IiOiJMb0EzIiwiYXpwIjoiMGNlZTA2ODMtODVhZS00OWYyLWE2M2QtMjlmOTdhYWQxOTExIiwiYXV0aF90aW1lIjoxNjMxNjYzMDUzLCJpc3MiOiJodHRwczpcL1wvaWQuYWxmYWJhbmsucnUiLCJleHAiOjE2MzE2NjY2NjMsImlhdCI6MTYzMTY2MzA2Mywibm9uY2UiOiJuLTBTNl9XekEyTWoifQ .xBE6LEUxOKleHCZVQacldJfKr5KtyyvJKCCmInqapmRJ_aRF-cEoVfpJd_kxlNmJYT7AcjMMppovNkmhB49VL5DK8FhF0fvRgLskKR9Eohy4eiC8ued03Z1LyLz1H7EcKSkusaCIajzIvxxZfVtSHI4jmgLg6ItXPdZgIDUWINgESkl6I7IP5CbfONHweNnbkWEOEzxDgGGnxxtPxrWVoPVP-ijUeUSH_iESHfrhY_ePRMYi2If62IsKX_0GT5BHRYOhXVDZ9fyn5fRCvg8_QoCykDVIOZMtWQ3w4TadqS0dfMlsLBxkVbVftzH2fWRLTCX3SJ5AXiytHkpow8V45w
header
{
  "kid": "alfa-test-jwt",
  "typ": "JWT",
  "alg": "RS256"
}
payload
{
  "sub": "3228e68e-cc34-4b82-b43d-49112b5d9d3e",
  "aud": "0cee0683-85ae-49f2-a63d-29f97aad1911",
  "acr": "LoA3",
  "azp": "0cee0683-85ae-49f2-a63d-29f97aad1911",
  "auth_time": 1631663053,
  "iss": "https://id.alfabank.ru",
  "exp": 1631666663,
  "iat": 1631663063,
  "nonce": "n-0S6_WzA2Mj"
}
signature
RSASHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),

  your-256-bit-secret
) // secret base64 encoded
Пример userinfo
Закодированный Раскодированный
eyJraWQiOiJhbGZhLXRlc3Qtand0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJjdXMiOiJVQUFBQUEiLCJzdWIiOiIzMjI4ZTY4ZS1jYzM0LTRiODItYjQzZC00OTExMmI1ZDlkM2UiLCJiaXJ0aGRhdGUiOiIyMDAwLTAyLTIwIiwicm9sZSI6IkFDQ09VTlRBTlQsIE1BTkFHRVIiLCJnZW5kZXIiOiJNQUxFIiwiaWRlbnRpdHlfZG9jdW1lbnRfbmFtZSI6ItCf0LDRgdC_0L7RgNGCINCz0YDQsNC20LTQsNC90LjQvdCwINCg0KQiLCJpZGVudGl0eV9kb2N1bWVudF9udW1iZXIiOjIyMjIyMiwiaXNzIjoiaHR0cHM6XC9cL2JhYXMuYWxmYWJhbmsucnUiLCJpbm4iOjc0MTUxMTExMjIyMiwiZWlvIjp0cnVlLCJnaXZlbl9uYW1lIjoi0KLQtdGB0YIiLCJtaWRkbGVfbmFtZSI6ItCi0LXRgdGC0L7QstC40YciLCJhY3VzIjoiWEFBQUFBIiwiaWRlbnRpdHlfZG9jdW1lbnRfc2VyaWVzIjoxMTExLCJhdWQiOiIwY2VlMDY4My04NWFlLTQ5ZjItYTYzZC0yOWY5N2FhZDE5MTEiLCJhY2xjIjoiWEFBQUExIiwidXBkYXRlZF9hdCI6IjIwMjItMDEtMjAiLCJuYW1lIjoi0KLQtdGB0YLQvtCyINCi0LXRgdGCINCi0LXRgdGC0L7QstC40YciLCJwaG9uZV9udW1iZXIiOjc5MTkxMTEyMjMzLCJjbGMiOiJVQUFBQTEiLCJmYW1pbHlfbmFtZSI6ItCi0LXRgdGC0L7QsiIsImVtYWlsIjoiZW1haWxAZW1haWwucnUifQ.WVr5xkQSEGqpPXN3aIo0zHZLDL0vvtxEEQ83BrgJo7l0BjjALeGDRYENF2bL8j3n1pXRnduiBQcYNV6teBhESI8V_8kd7Kh7LTePkJWadPSvD__KskC69b4XZ-zN-IQ73NmAcBDStnnhSXGKL6xhdRy-TGiAoKPsRWiDVntsDlpCQNHAt3tJk8q_SQS4S1k6qju9eJ2GFkgmd6z8rR2vaBykaOF0K61ltksw6YgXhuek3OlYkqIAivyKYl59uio8zMpJk-YrPlmawwmvWPF0vKhaLj8Mvn4mVMsVSfuVVKP2ksHG0MAlWpO3Sh9GoKO4d6TQplJ4vgIIeNx-44npqw
header
{
  "kid": "alfa-test-jwt",
  "typ": "JWT",
  "alg": "RS256"
}
payload
{
  "cus": "UAAAAA",
  "sub": "3228e68e-cc34-4b82-b43d-49112b5d9d3e",
  "birthdate": "2000-02-20",
  "role": "ACCOUNTANT, MANAGER",
  "gender": "MALE",
  "identity_document_name": "Паспорт гражданина РФ",
  "identity_document_number": 222222,
  "iss": "https://baas.alfabank.ru",
  "inn": 741511112222,
  "eio": true,
  "given_name": "Тест",
  "middle_name": "Тестович",
  "acus": "XAAAAA",
  "identity_document_series": 1111,
  "aud": "0cee0683-85ae-49f2-a63d-29f97aad1911",
  "aclc": "XAAAA1",
  "updated_at": "2022-01-20",
  "name": "Тестов Тест Тестович",
  "phone_number": 79191112233,
  "clc": "UAAAA1",
  "family_name": "Тестов",
  "email": "email@email.ru"
}
signature
RSASHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),

  your-256-bit-secret
) // secret base64 encoded
Алгоритм проверки подписи
  1. 1.
    Вычислите хэш-функцию SHA256 от данных Base64URL(Header).Base64URL(Payload).
  2. 2.
    Дешифруйте данные Base64URL(Signature), используя алгоритм RS256 и открытый ключ с идентификатором, переданным в Заголовке (Header) в клэйме kid (в приведенном выше примере это alfa-test-jwt).
  3. 3.
    Сравните вычисленный хэш из 1 шага и дешифрованные данные из 2 шага. Если значения равны, значит, подпись верна.

Сертификат для проверки электронной подписи certificate-prod.