Authorization Code Flow с PKCE — основной сценарий входа пользователя через REGOS. Он подходит для сайта, мобильного приложения, SPA и серверного веб-приложения. Идея простая: пользователь входит на стороне REGOS, ваше приложение получает короткий одноразовый код, а затем меняет этот код на токены.
PKCE нужен для защиты кода авторизации. Даже если кто-то перехватит код возврата, он не сможет обменять его на токены без code_verifier, который остался у вашего приложения.

Перед началом интеграции получите client_id для вашего приложения и зарегистрируйте redirect_uri. Это адрес в вашем приложении, куда REGOS вернет пользователя после входа. Адрес должен совпадать с зарегистрированным значением полностью, включая протокол https, путь и завершающий слэш, если он есть.
Если ваше приложение является серверным и ему выдан client_secret, храните секрет только на сервере. Не вставляйте секрет в frontend, мобильное приложение, HTML-страницу или JavaScript.
Перед открытием страницы авторизации приложение создает случайную строку code_verifier. Из нее вычисляется code_challenge, который отправляется в REGOS. Рекомендуемый метод — S256.
Обычно библиотека OAuth делает это автоматически. Если вы реализуете процесс вручную, используйте случайную строку длиной от 43 до 128 символов и вычислите:
code_challenge = BASE64URL(SHA256(code_verifier))
Пользователь должен открыть адрес /oauth/authorize в браузере. Это не серверный запрос: пользователь увидит страницу входа REGOS, пройдет авторизацию и затем будет возвращен на ваш redirect_uri.
GET https://auth.regos.uz/oauth/authorize?response_type=code&client_id=your_client_id&redirect_uri=https%3A%2F%2Fyour.app%2Fcallback&scope=openid%20profile%20email&state=random_state&code_challenge=your_code_challenge&code_challenge_method=S256
Параметр state нужен для защиты от подмены ответа. Сохраните его до перехода на REGOS и после возврата проверьте, что значение не изменилось.
Если scope не передан, REGOS использует разрешения, которые настроены для клиента. Для OpenID Connect обычно нужен openid; для email добавьте email, для расширенного профиля — profile, для телефона — phone.
После успешного входа REGOS перенаправит пользователя на ваш redirect_uri. В адресе будет параметр code, а также state, если вы передавали его на первом шаге.
https://your.app/callback?code=one_time_code&state=random_state
Код авторизации короткоживущий и одноразовый. Не сохраняйте его надолго и не используйте повторно. Сразу обменяйте его на токены.
Запрос на обмен кода отправляется методом POST в формате application/x-www-form-urlencoded. Если вы использовали PKCE, обязательно передайте исходный code_verifier.
curl -X POST https://auth.regos.uz/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "code=one_time_code" \
-d "redirect_uri=https%3A%2F%2Fyour.app%2Fcallback" \
-d "client_id=your_client_id" \
-d "code_verifier=your_code_verifier"
Для confidential-клиента добавьте client_secret. Для публичного клиента секрет не используется.
Успешный ответ содержит токены. Значение expires_in показывает срок жизни access_token в секундах. Не задавайте это значение вручную в приложении: используйте то, что пришло в ответе.
{
"access_token": "eyJ...access_token",
"token_type": "Bearer",
"id_token": "eyJ...id_token",
"expires_in": 600,
"refresh_token": "opaque_refresh_token",
"scope": "openid profile email"
}
access_token передается в API в заголовке Authorization.
Authorization: Bearer eyJ...access_token
Если вам нужно получить данные профиля пользователя, вызовите /oauth/userinfo. Набор полей в ответе зависит от выданных scope.
Когда access_token истек, не отправляйте пользователя на повторный вход сразу. Сначала попробуйте обновить токен через refresh_token.
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=opaque_refresh_token" \
-d "client_id=your_client_id"
Если ваш клиент confidential, добавьте client_secret. После успешного обновления сохраните новый access_token и новый refresh_token, если он есть в ответе. Старые значения больше не должны использоваться.
id_token — это JWT, который подтверждает факт входа пользователя. Проверяйте подпись токена публичными ключами REGOS, issuer, audience и срок действия. Публичные ключи доступны через endpoint JWKS, а служебные адреса можно получить из OpenID configuration.