Code flow

Authorization Code Flow (PKCE)

Схема Authorization Code Flow (PKCE):

0. Инициализация клиента

Генерация Code Verifier:

  • Code Verifier - это криптографически случайная строка (43-128 символов)
  • Допустимые символы: A-Z, a-z, 0-9, "-", ".", "_", "~"
  • Пример: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

Создание Code Challenge:

Code Challenge - это хэш Code Verifier закодированный в Base64.

code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))

Пример: E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM

1. Переадресация на страницу единого профиля для авторизации

Endpoint для переадресации: https://auth.regos.uz/oauth/authorize

Запрос отправляется методом [GET].

Параметры запроса: response_type, client_id, redirect_uri, code_challenge, code_challenge_method... подробнее.

2. Ответ единого профиля авторизации

После успешной авторизации пользователь возвращается на указанный ранее URL (redirect_uri), в параметрах которого содержится код авторизации code. _*Код авторизации в дальнейшем обменивается на токен для доступа к API.

3. Запрос токена

Endpoint для получения токена: https://auth.regos.uz/oauth/token

Запрос отправляется методом [POST].

Параметры а теле запроса: grant_type, code, redirect_uri, client_id, code_verifier подробнее

4. Ответ с токеном

В выходных параметрах метода [POST] .../oauth/token возвращается 3 токена:

  • Токен доступа к API (access_token) - Дает доступ к API. Передаётся в заголовках запросов.
  • ID Token (id_token) - это JWT токен, который содержит информацию о пользователе в OpenID Connect.
  • Токен для обновления токена доступа (refresh_token) - Используется для получение новых access_token без повторной аутентификации.

Структура id_token

id_token - это JWT токен, который содержит информацию о пользователе в OpenID Connect. Он состоит из 3-х частей, разделённых точками: заголовок (Header), данные (Payload), публичный ключ (Signature). Header и Payload закодированы в base64 и подписаны секретным ключом.

Пример ID токена:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzaWQiOiI5ZTg0YzY0Yi1mMjVlLTQ0YjktOTQ0ZC1mZDI3MjQ4YjUwYzEiLCJzdWIiOiJiNzJkMWE1OS00ZDk0LTQ3Y2YtYTg1ZS1hZTMzYjQ4M2Q1ZTIiLCJpc3MiOiJodHRwczovL2F1dGguZXhhbXBsZS5jb20iLCJpYXQiOjE3NDc2NzEwMjEsImV4cCI6MTc0NzY3MTkyMSwiYXV0aF90aW1lIjoxNzQ3NjcxMDIxLCJlbWFpbCI6InVzZXIxMjNAZXhhbXBsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6InRydWUiLCJwaG9uZV9udW1iZXIiOiIrMTIzNDU2Nzg5MDEiLCJwaG9uZV9udW1iZXJfdmVyaWZpZWQiOiJ0cnVlIiwiZ2l2ZW5fbmFtZSI6IkpvaG4iLCJmYW1pbHlfbmFtZSI6IkRvZSIsInBpY3R1cmUiOiJodHRwczovL2V4YW1wbGUuY29tL3BpYy5qcGciLCJjb21wYW55IjoiQ29tcGFueSBYIiwiYXVkIjoiY2xpZW50XzEyM2FiY2Q0NWVmNjc4OTAxIn0.f4k3r4nD0mJw0rXyLp9qQz2v5sT8uG7hB6nM1kL9oP3iC4dA5eF6gH7jK8l
Заголовок (Header)

Заголовок содержит информацию о токене и алгоритме его подписи.

Пример заголовка:

{
  "alg": "RS256",
  "typ": "JWT"
}

Состав заголовка:

  • alg - Алгоритм подписи (RSA подпись с SHA-256);
  • typ - Тип токена (JWT).
Данные (Payload)

Payload содержит информацию о пользователе в OpenID Connect.

Пример Payload:

{
  "sid": "9e84c64b-f25e-44b9-944d-fd27248b50c1",
  "sub": "b72d1a59-4d94-47cf-a85e-ae33b483d5e2",
  "iss": "https://auth.regos.uz",
  "iat": 1747671021,
  "exp": 1747671921,
  "auth_time": 1747671021,
  "email": "user123@example.com",
  "email_verified": "true",
  "phone_number": "+998987654321",
  "phone_number_verified": "true",
  "given_name": "John",
  "family_name": "Doe",
  "picture": "https://example.com/pic.jpg",
  "company": "Company Example",
  "aud": "client_123abcd45ef678901"
}

Состав Payload:

  • sid - Идентификатр сессии.
  • sub (subject) - Идентификатр авторизации пользователя;
  • iss (issuer) - URL сервиса авторизации;
  • iat (issued at) - Время, в которое был выдан токен (в формате Unix time);
  • exp (expiration) - Время окончания жизни токена (в формате Unix time);
  • auth_time - Время, в которое произошла авторизация;
  • email - Адрес электронной почты пользователя;
  • email_verified - Статус верификации электронной почты пользователя: true - Верифицирована, false - Не верифицирована;
  • phone_number - Номер телефона пользователя (в формате +XXXXXXXXXXXX);
  • phone_number_verified - Статус верификации номера телефона пользователя: true - Верифицирован, false - Не верифицирован;
  • given_name - Имя пользователя;
  • family_name - Фамилия пользователя;
  • picture - Изображения пользователя;
  • company - Наименование предприятия пользователя;
  • aud (audience) - Идентификатр пользователя.