Получение и обновление токенов
Способы аутентификации приложения
Мы поддерживаем два стандарта аутентификации клиента:
-
client_secret_basicРекомендуемый. Мы используем стандартный механизм HTTP Basic Authentication. Учетные данныеclient_idиclient_secretпередаются в HTTP-заголовкеAuthorization. Предварительно их необходимо объединить через двоеточие (client_id:client_secret) и закодировать в Base64.
Итоговый заголовок будет выглядеть так:Authorization: Basic bXlfaWQ6bXlfc2VjcmV0. -
client_secret_post. Учетные данныеclient_idиclient_secretпередаются напрямую в теле запроса.
1. Получение токенов (Authorization Code)
Используйте этот запрос для первичного получения токенов после того, как пользователь авторизовался.
URL для обмена кода на токены и обновление токенов:
POST https://api.flida.ru/oidc/token
Content-Type:
application/x-www-form-urlencoded
Параметры тела запроса
| Параметр | Описание |
|---|---|
grant_type | Обязательный параметр Тип авторизации. Для данного запроса всегда передавайте значение authorization_code.Пример: authorization_code |
code | Обязательный параметр Код авторизации, который вы получили при успешном редиректе после прохождения Authorization Flow. Пример: gTqEcwBiRN3VE2ttxc... |
code_verifier | Обязательный параметр Та же самая случайная строка, которую вы сгенерировали в приложении на 1 шаге до применения функции хеширования. Пример: my_random_verifier_string |
redirect_uri | Обязательный параметр Тот же самый redirect_uri, который вы передавали на первом шаге в Authorization Flow. Должен совпадать строго.Пример: https://myapp.ru/callback |
client_id | Обязательный параметр* Идентификатор вашего приложения. Обязателен, если вы используете метод аутентификации client_secret_post. Если используете client_secret_basic, то передавать в теле не надо. |
client_secret | Обязательный параметр* Секретный ключ вашего приложения. Обязателен, если вы используете метод аутентификации client_secret_post. Если используете client_secret_basic, передавать в теле не надо. |
Пример запроса client_secret_basic
POST /oidc/token HTTP/1.1
Host: api.flida.ru
Content-Type: application/x-www-form-urlencoded
Authorization: Basic MDE5ZDlhOGEtN2Y4Yi03ZjU0LTlkNGUtNGE5ZWNjOWZjNjA5Om15X3N1cGVyX3NlY3JldA==
grant_type=authorization_code&code=gTqEcwBiRN3VE...&code_verifier=my_random_verifier_string&redirect_uri=https://myapp.com/callbackПример запроса client_secret_post
POST /oidc/token HTTP/1.1
Host: api.flida.ru
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=gTqEcwBiRN3VE...&code_verifier=my_random_verifier_string&redirect_uri=https://myapp.com/callback&client_id=019d9a8a-7f8b-7f54-9d4e-4a9ecc9fc609&client_secret=my_super_secretУспешный обмен кода на токены
При успешном запросе сервер вернет статус 200 OK и JSON-объект:
{
"access_token": "eyJhbG...",
"expires_in": 3600,
"id_token": "eyJhbG...",
"refresh_token": "dGVzdF9yZWZyZXNo...",
"token_type": "Bearer"
}| Параметр | Тип | Описание |
|---|---|---|
access_token | string | Этот токен вам понадобится для получения информации о пользователе. Подробнее см. в разделе Информация о пользователе. |
expires_in | int | Время жизни access_token в секундах. |
id_token | string | JWT-токен, содержащий в себе идентификационные данные пользователя и мета информацию. |
refresh_token | string | Токен для обновления access_token. |
token_type | string | Тип токена. Всегда возвращается значение Bearer. |
ID Token
id_token — это JWT-токен. В нем лежат scope, которые вы запрашивали на этапе Авторизации, а также определенная мета-информация о самом токене.
Это полезно для первичной идентификации пользователя и получения его профиля без необходимости делать отдельный запрос к API.
Однако, если вам нужно обновить информацию о пользователе, используйте access_token. Подробнее см. в разделе Информация о пользователе.
Payload:
Наполнение зависит от тех scope, что вы запросили ранее. В максимальной комплектации представлены следующие ключи:
{
"iss": "https://api.flida.ru",
"sub": "v1.ffd02a9186905c46c21a2f671ec665470c9533660658bcf4e610369a57155658",
"aud": "019d9a8a-7f8b-7f54-9d4e-4a9ecc9fc609",
"exp": 1714000000,
"iat": 1713996400,
"date_of_birth": "2001-01-02",
"email": "test@test.ru",
"email_verified": true,
"given_name": "Александр",
"family_name": "Пушкин",
"middle_name": "Сергеевич",
"nickname": "Пушкин А. С.",
"phone_number": "+79107777777",
"phone_number_verified": true,
"sex": "male"
}| Ключ | Описание |
|---|---|
iss | Всегда равен базовому URL нашего OIDC-сервера. Пример: https://api.flida.ru |
sub | Pairwise идентификатор. Уникален для связки определенного пользователя и конкретного приложения-клиента. Пример: v1.ffd02a9186905c... |
aud | Значение должно совпадает с вашим client_id.Пример: 019d9a8a-7f8b-7f54-9d4e-4a9ecc9fc609 |
exp, iat | Время истечения (exp) и выпуска (iat) токена в формате Unix timestamp. |
given_name | scope nameИмя. Пример: Александр |
family_name | scope nameФамилия. Пример: Пушкин |
middle_name | scope nameОтчество. Пример: Сергеевич |
nickname | scope nicknameПсевдоним. Генерируется на основе ФИО, если не указан явно. Пример: Пушкин А. С. |
date_of_birth | scope date_of_birthДата рождения в формате YYYY-MM-DD. Пример: 2001-01-02 |
sex | scope sexПол. Доступные значения: female (женский) или male (мужской).Пример: female |
phone_number | scope phoneНомер телефона. Пример: +79107777777 |
phone_number_verified | scope phoneФлаг ( bool), указывающий, подтвержден ли телефон в системе.Пример: true |
email | scope emailАдрес электронной почты. Пример: test@test.ru |
email_verified | scope emailФлаг ( bool), указывающий, подтверждена ли почта в системе.Пример: true |
aud из ID токена с вашим client_id. Если значения не
совпадают, токен должен быть отклонен.
А также сверяйте поле iss с актуальным iss нашего сервера и проверяйте подпись ID токена публичным ключом.
Узнать актуальный iss и получить публичный ключ можно сделав запрос на /.well-known/openid-configuration
endpoint.
Подробнее об этом см. в разделе
.well-known endpoints.2. Обновление токенов (Refresh Token)
access_token имеет ограниченный срок жизни (1 час). Вы можете получить новый токен, сделав запрос на тот же эндпоинт, воспользовавшись refresh_token.
URL для обмена кода на токены и обновление токенов:
POST https://api.flida.ru/oidc/token
Аутентификация: Те же требования (через Basic или в теле POST-запроса).
Параметры тела запроса
| Параметр | Описание |
|---|---|
grant_type | Обязательный параметр Передайте значение refresh_token. |
refresh_token | Обязательный параметр Значение refresh_token, который вы получили в предыдущем ответе при первичном обмене кода на токены.Пример: dGVzdF9yZWZyZXNo... |
client_id | Обязательный параметр* Идентификатор вашего приложения. Обязателен, если вы используете метод аутентификации client_secret_post. Если используете client_secret_basic, передавать в теле не надо. |
client_secret | Обязательный параметр* Секретный ключ вашего приложения. Обязателен, если вы используете метод аутентификации client_secret_post. Если используете client_secret_basic, передавать в теле не надо. |
Пример запроса client_secret_basic
POST /oidc/token HTTP/1.1
Host: api.flida.ru
Content-Type: application/x-www-form-urlencoded
Authorization: Basic MDE5ZDlhOGEtN2Y4Yi03ZjU0LTlkNGUtNGE5ZWNjOWZjNjA5Om15X3N1cGVyX3NlY3JldA==
grant_type=refresh_token&refresh_token=dGVzdF9yZWZyZXNo...Пример запроса client_secret_post
POST /oidc/token HTTP/1.1
Host: api.flida.ru
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&refresh_token=dGVzdF9yZWZyZXNo...&client_id=019d9a8a-7f8...&client_secret=my_super_secretУспешное обновление токенов
При успешном запросе сервер вернет статус 200 OK и JSON-объект. Обратите внимание, что вместе с access_token возвращается и новый refresh_token.
{
"access_token": "koPsldA...",
"expires_in": 3600,
"id_token": "koPsldA...",
"refresh_token": "lspOenscaASdk...",
"token_type": "Bearer"
}| Параметр | Тип | Описание |
|---|---|---|
access_token | string | Этот токен вам понадобится для получения информации о пользователе. Подробнее см. в разделе Информация о пользователе. |
expires_in | int | Время жизни access_token в секундах. |
id_token | string | JWT-токен, содержащий в себе идентификационные данные пользователя и мета информацию. |
refresh_token | string | Новый токен для последующего обновления access_token. |
token_type | string | Тип токена. Всегда возвращается значение Bearer. |
3. Получение и обновление токенов с ошибкой
Логика обработки ошибок одинакова как для получения, так и для обновления токенов. В ситуациях, когда переданы неверные параметры,
не совпадает redirect_uri или истек/не найден code / refresh_token, сервер не сможет выдать токены.
В этом случае ошибка вернется в формате JSON с кодом 400 Bad Request, 401 Unauthorized или 500 Internal Server Error.
Особенности обработки ошибки невалидного клиента (invalid_client):
При передаче неправильных client_id или client_secret HTTP-код ответа зависит от выбранного вами метода аутентификации:
- Если вы использовали
client_secret_basic, сервер вернет статус401 Unauthorizedand дополнительно передаст заголовокWWW-Authenticate: Basic realm="oidc". - Если вы использовали
client_secret_post, сервер вернет статус400 Bad Request.
Пример тела ответа с ошибкой:
{
"error": "invalid_grant",
"error_description": "consent not granted"
}