Анонимные
Раздел «Анонимные» — запросы, которые можно вызывать без авторизации: именно эти два метода
стоят в начале пользовательского OAuth2/OIDC-потока, описанного в разделе
«OAuth2». Для них не нужен заголовок Authorization.
Поток авторизации
Эти запросы оборачивают стандартный OAuth2 Authorization Code Flow (см. «Общие ресурсы»), чтобы клиенту не нужно было вручную собирать URL авторизации и параметры обмена кода на токен:
Клиент открывает этот URL в браузере или WebView пользователя. Пользователь проходит аутентификацию.
Сервер авторизации перенаправляет браузер обратно на redirectUri приложения с
параметром ?code=... в query-строке.
Клиент забирает этот code и вызывает
POST /v1/anonymous/auth, передавая code и тот же redirectUri, что использовался на шаге 3 —
сервис обменивает код на пару токенов.
Полученный accessToken используется дальше как
Authorization: Bearer <accessToken> во всех остальных запросах к Voice API
(см. «Аутентификация»).
redirectUri должен совпадать байт в байтСервер авторизации сверяет redirectUri, переданный на шаге 4, с тем, что был использован при
получении code на шаге 2–3 (это защита протокола OAuth2, а не особенность Voice). Если значения
не совпадут хотя бы одним символом — обмен кода на токен завершится ошибкой. Храните redirectUri,
с которым был инициирован конкретный вход, и переиспользуйте именно его.
Объект AuthResponse
Пара токенов и сопутствующие метаданные сессии, которые сервер авторизации возвращает в ответ на обмен кода авторизации.
| Поле | Тип | Описание |
|---|---|---|
accessToken | string | Access-токен (JWT) — используется как Bearer-токен во всех дальнейших запросах к Voice API. |
tokenType | string | Тип токена, обычно "Bearer". |
expiresIn | integer | Через сколько секунд accessToken истечёт. |
refreshToken | string | Токен обновления — используется для получения новой пары токенов без повторного прохождения интерактивного логина (см. «Обновить токен» в разделе «Пользователи»). |
refreshExpiresIn | integer | Через сколько секунд истечёт refreshToken. |
idToken | string | OIDC ID-токен (JWT) с данными о пользователе. |
notBeforePolicy | integer | Метка not-before policy — токены, выпущенные до этой метки, считаются недействительными. |
sessionState | string | Идентификатор сессии, к которой привязана эта пара токенов. |
scope | string | Список выданных OAuth2-областей действия (scopes), разделённых пробелом. |
Объект ошибки
При любой ошибке (в том числе просроченном или уже использованном code) вместо 200 OK
возвращается default-ответ с тем же телом для обоих методов:
| Поле | Тип | Описание |
|---|---|---|
code | integer | Числовой код ошибки (см. google.rpc.Code — тот же список, что используют gRPC-статусы остальных сервисов Voice). |
message | string | Человекочитаемое описание ошибки. |
details | array | Дополнительные структурированные детали ошибки (google.protobuf.Any); в большинстве случаев пуст. |
{
"code": 3,
"message": "authorization code is invalid or expired",
"details": []
}
Получить URL авторизации
/v1/anonymous/authorize-urlВозвращает URL страницы входа, на который нужно перенаправить пользователя, чтобы начать
Authorization Code Flow (шаг 1 из «Поток авторизации»). Параметров запроса
нет — URL уже содержит все нужные client_id, redirect_uri по умолчанию, response_type и
scope, настроенные на стороне Voice.
Ответ 200 OK
| Поле | Тип | Описание |
|---|---|---|
url | string | Полный URL страницы авторизации, готовый к открытию в браузере пользователя. |
{
"url": "https://auth.iopta.org/oauth2/authorize?client_id=voice-app&response_type=code&scope=openid&redirect_uri=https%3A%2F%2Fapp.iopta.org%2Fcallback"
}
Ответ default (ошибка)
Стандартный объект ошибки.
Обменять код на токены
/v1/anonymous/authЗавершает Authorization Code Flow: обменивает одноразовый code, полученный после успешного
входа пользователя, на пару access/refresh токенов (шаг 4 из
«Поток авторизации»).
code одноразовыйКак и в стандартном OAuth2 Authorization Code Flow, code можно обменять на токены только один
раз. Повторный вызов с уже использованным code вернёт ошибку — не ретрайте этот запрос вслепую
при сетевом сбое, сначала проверьте, не прошёл ли предыдущий вызов на самом деле.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
code | string | Код авторизации из query-параметра code, с которым сервер авторизации перенаправил пользователя на redirectUri. |
redirectUri | string | Тот же redirect_uri, что был использован при получении code — значение должно совпадать байт в байт (см. предупреждение в разделе «Поток авторизации»). |
{
"code": "4c7e1a1e-8f2b-4a3c-9d0e-2b6f5a9c1d34.session-state",
"redirectUri": "https://app.iopta.org/callback"
}
Ответ 200 OK
Объект AuthResponse.
{
"accessToken": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ...",
"expiresIn": 300,
"refreshExpiresIn": 1800,
"refreshToken": "eyJhbGciOiJIUzUxMiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ...",
"tokenType": "Bearer",
"idToken": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ...",
"notBeforePolicy": 0,
"sessionState": "3f1c9e2a-6b7d-4e5f-8a9b-1c2d3e4f5a6b",
"scope": "openid profile email"
}
Ответ default (ошибка)
Стандартный объект ошибки — например, при истёкшем, уже использованном или
синтаксически неверном code, либо при несовпадении redirectUri.