Authorization Code Flow с PKCE — стандартный способ аутентификации пользователя и получения доступа к API. Подходит для веб-приложений, мобильных приложений и SPA. Поток обеспечивает защиту кода авторизации даже без хранения секретов на клиенте.
auth.regos.uz (Единый профиль).access_token.code_verifier и code_challenge.
client_id у сотрудников REGOS.redirect_uri (HTTPS) на стороне авторизационного сервера.Важно. Для публичных клиентов (мобильное/SPA) client_secret не используется. Для серверных клиентов храните client_secret только на сервере.
Сформируйте параметры на клиенте.
code_verifier — случайная строка длиной 43–128 символов из A–Z a–z 0–9 - . _ ~.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXkcode_challenge = BASE64URL(SHA256(ASCII(code_verifier)))S256.E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cMРекомендация. Используйте только code_challenge_method=S256.
Endpoint: https://auth.regos.uz/oauth/authorize
Метод: GET
Обязательные параметры:
response_type=codeclient_idredirect_uri — строго как зарегистрированcode_challengecode_challenge_method=S256state — случайная строка для защиты от CSRF Пример запроса:
GET [https://auth.regos.uz/oauth/authorize](https://auth.regos.uz/oauth/authorize)?
response_type=code&
client_id=client_123abcd45ef678901&
redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback&
code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM&
code_challenge_method=S256&
state=2d86c3b9f7
После входа сервер выполнит редирект на redirect_uri:
[https://app.example.com/callback?code=SplxlOBeZQQYbYS6WxSbIA&state=2d86c3b9f7](https://app.example.com/callback?code=SplxlOBeZQQYbYS6WxSbIA&state=2d86c3b9f7)
state. code — он нужен для обмена на токены.error и error_description.Endpoint: https://auth.regos.uz/oauth/token
Метод: POST
Заголовок: Content-Type: application/x-www-form-urlencoded
Тело запроса:
grant_type=authorization_codecoderedirect_uri — тот же, что в шаге 5client_idcode_verifier — исходное значение из шага 4Пример (cURL):
curl -X POST https://auth.regos.uz/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "code=SplxlOBeZQQYbYS6WxSbIA" \
-d "redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback" \
-d "client_id=client_123abcd45ef678901" \
-d "code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
Успешный ответ содержит:
access_token — токен доступа к API;id_token — JWT по OpenID Connect с данными профиля;refresh_token — токен обновления;token_type — Bearer;expires_in — срок жизни access_token (секунды).Пример:
{
"access_token": "eyJhbGciOiJ...access...",
"id_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9....",
"refresh_token": "def50200...refresh...",
"token_type": "Bearer",
"expires_in": 3600
}
access_token по refresh_tokenEndpoint: https://auth.regos.uz/oauth/token
Метод: POST
Заголовок: Content-Type: application/x-www-form-urlencoded
Тело запроса:
grant_type=refresh_tokenrefresh_tokenclient_idПример (cURL):
curl -X POST https://auth.regos.uz/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=refresh_token" \
-d "refresh_token=def50200...refresh..." \
-d "client_id=client_123abcd45ef678901"
Ответ содержит новый access_token и, при необходимости, новый refresh_token.
id_token: состав и проверкаid_token — это JWT из трёх частей: Header, Payload, Signature.
Пример Header:
{ "alg": "RS256", "typ": "JWT" }
Пример 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"
}
Проверьте на сервере:
RS256.iss, aud.exp (и при необходимости iat, auth_time, nonce).