authorize
[GET] /oauth/authorize
Этот метод открывается в браузере пользователя и начинает вход через REGOS. Его не нужно вызывать скрытым серверным запросом: пользователь должен попасть на страницу авторизации, войти в профиль и затем вернуться в ваше приложение.
Минимальный запрос содержит тип ответа code, идентификатор клиента и адрес возврата. Для безопасной интеграции добавьте state и PKCE-параметры.
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
Параметры передаются в query string:
| Название | Обязательность | Описание |
|---|---|---|
response_type |
Да | Всегда code. |
client_id |
Да | Идентификатор вашего приложения. |
redirect_uri |
Да | Адрес возврата после входа. Должен совпадать с зарегистрированным адресом. |
scope |
Нет | Запрашиваемые права, разделенные пробелами, например openid profile email. Если не передать, REGOS использует разрешения клиента. |
state |
Рекомендуется | Случайное значение для защиты от подмены ответа. REGOS вернет его без изменений. |
prompt |
Нет | Управляет поведением входа. Например, login просит войти заново, consent показывает согласие, none запрещает показывать экран входа. |
nonce |
Нет | Значение для связывания запроса с id_token. Используется в OpenID Connect. |
code_challenge |
Да при RequirePkce=true или временном входе |
PKCE challenge, вычисленный из code_verifier. У новых public-клиентов PKCE обязателен. |
code_challenge_method |
Рекомендуется | Используйте S256. |
После успешного входа REGOS перенаправит пользователя на redirect_uri:
https://your.app/callback?code=one_time_code&state=random_state&iss=https%3A%2F%2Fauth.regos.uz
Если вход невозможен, REGOS вернет OAuth-ошибку. Если redirect_uri принят, ошибка будет отправлена на него в query string, например error=login_required. Ваше приложение должно обработать и успешный ответ, и ошибку.
Адрес возврата и PKCE
REGOS сравнивает адрес возврата с зарегистрированным адресом точно: регистр пути, завершающий слеш и query string имеют значение. Для native-приложений с HTTP loopback-адресом 127.0.0.1 или [::1] может отличаться только порт. Например, регистрация http://127.0.0.1/callback разрешает возврат на http://127.0.0.1:49152/callback. Это исключение не распространяется на localhost, другие хосты или custom scheme. При обмене кода на токены передайте точный адрес из исходного запроса, включая фактически использованный порт.
Для новых public-клиентов PKCE обязателен, разрешён только метод S256. Для совместимости обычный вход существующих клиентов с RequirePkce=false допускается без PKCE. Это временное исключение: новые native-интеграции должны использовать PKCE. Переданный challenge всегда проверяется, а при обмене кода требуется соответствующий verifier. Временный вход всегда требует S256, даже при RequirePkce=false.
Сгенерируйте случайный code_verifier длиной 43–128 символов из букв ASCII, цифр и -._~, затем вычислите BASE64URL(SHA256(code_verifier)) без padding. Метод plain возможен только для confidential-клиента, которому он отдельно разрешён, и только вне временного входа; для новых интеграций используйте S256.
Управление входом
| Параметр | Поведение |
|---|---|
prompt=login |
Требует новой аутентификации. Простого выбора сохранённого аккаунта недостаточно. |
prompt=select_account |
Открывает выбор аккаунта, включая текущий. Выбор текущего аккаунта не требует смены сессии и не считается повторной аутентификацией. Повторный ввод учётных данных зависит от состояния выбранного аккаунта. |
prompt=consent |
Запрашивает экран согласия даже при ранее выданном разрешении. |
prompt=none |
Запрещает интерактивные экраны; при необходимости входа возвращает login_required, согласия — consent_required. Нельзя сочетать с другими значениями prompt. |
max_age |
Неотрицательное число секунд с последней аутентификации. При превышении нужна новая аутентификация; 0 требует её сразу. В ID token возвращается auth_time. |
login_hint |
Подсказка для поля телефона на странице входа. Не подтверждает личность и не ограничивает выбор аккаунта. |
ui_locales |
Предпочтительные языки через пробел, например uz ru en. Используется первый поддерживаемый язык; неподдерживаемые пропускаются. |
Текущие интеграции с внешними провайдерами входа не подтверждают время активной аутентификации. Такой вход доступен для обычной авторизации, но не удовлетворяет prompt=login или max_age: в этом случае REGOS возвращает login_required. Для повторной аутентификации используйте вход с паролем REGOS. Время внешнего callback не подставляется в auth_time.
Выбранный через ui_locales язык сохраняется на экранах входа и выбора аккаунта и имеет приоритет над языком профиля в этом процессе. Настройка языка профиля не меняется.
Если во время показа согласия пользователь сменил сессию в другой вкладке, REGOS возвращает login_required. Форма согласия действует 10 минут; после истечения возвращается invalid_request. В обоих случаях приложение должно начать новый запрос авторизации.
В успешном redirect и в redirect с OAuth-ошибкой возвращается iss. Приложение должно сравнить его с ожидаемым issuer из discovery, проверить state, и только затем обменивать код. Если сам адрес возврата не прошёл проверку, REGOS отвечает ошибкой напрямую и не перенаправляет пользователя на него.
Правила адресов описаны в RFC 8252, параметр iss — в RFC 9207.
Доступ после выхода из браузера
Чтобы приложение продолжало работать после выхода или переключения аккаунта в
REGOS Auth, запросите scope=openid offline_access и prompt=consent.
Для выбора аккаунта используйте prompt=select_account consent. Сервер и настройки
клиента должны разрешать offline-доступ и refresh tokens.
При RequireConsent=false доступ, включая offline, заранее разрешён администратором:
сервер сохраняет разрешение автоматически, prompt=consent не обязателен.
Если он явно передан, REGOS всё равно показывает согласие.
При RequireConsent=true REGOS показывает согласие на каждый новый offline grant.
Без prompt=consent значение offline_access игнорируется; ранее сохранённое согласие
не заменяет подтверждение нового offline grant. Если offline-доступ отключён, явный запрос
offline-доступа возвращает invalid_scope.
После подтверждения приложение получает токены отдельной сессии. Выход из браузера
не завершает её. Сроки токенов, отзыв доступа, блокировка и смена пароля продолжают
действовать. Сессия видна пользователю в списке активных сессий с именем приложения.
Ранее выданные токены остаются привязанными к прежней браузерной сессии — для нового
поведения нужен новый вход с пользовательским или административным разрешением.
Временный вход без сохранения входа в браузере
Для клиента с включённой настройкой UseTemporaryLogin сервер показывает минимальную форму:
телефон и пароль. При необходимости согласия добавляются разрешения и кнопка «Войти и разрешить»,
при административном разрешении — кнопка «Войти». Настройка действует для клиента;
параметра URL для её включения нет. На сервере должны быть разрешены EnableTemporaryLogin
и EnableOfflineAccess, у клиента — offline_access и оба grant: authorization_code, refresh_token.
Запрос: response_type=code, PKCE S256, scope=openid offline_access,
prompt=login consent. Дополнительные scopes, state, nonce, login_hint и ui_locales
передаются как обычно. prompt=consent тоже допустим: пароль всё равно потребуется.
prompt=none возвращает login_required; отсутствие offline scope — invalid_scope,
отсутствие consent в prompt при RequireConsent=true — consent_required.
При RequireConsent=false можно использовать prompt=login или не передавать prompt:
offline-доступ разрешён администратором, дополнительное согласие не запрашивается.
Явный prompt=consent всегда показывает согласие. Если настройка изменилась на
RequireConsent=true после открытия формы без согласия, начните новый вход с prompt=consent.
Общий срок формы и обмена кода задаёт серверный Jwt:TemporaryLoginLifetime (по умолчанию
300 секунд). Ошибки ввода срок не продлевают. При отмене или истечении срока начните новый
запрос авторизации. max_age этот срок не меняет.
Вход не добавляет пользователя на полку и не создаёт cookie входа. Существующая сессия браузера
сохраняется. Обмен кода атомарно закрывает временный контекст и выдаёт токены независимой
offline-сессии; приложение продолжает работать после закрытия браузера. Выход из приложения —
отзыв refresh token через /oauth/revoke, который отзывает семейство токенов. Обычные правила
блокировки пользователя, смены пароля, отзыва сессий и истечения refresh token сохраняются.
Это дополнительная политика REGOS, а не новый OAuth grant или стандартный параметр prompt.
Для native-клиента используется системный браузер; пароль вводится только на странице REGOS Auth.