Авторизация
Перенаправление пользователя в Флида ID и получение кода авторизации с PKCE.
Шаг 1. Подготовьте PKCE
Перед каждым запросом на авторизацию создайте code_verifier: криптографически случайную строку длиной от 32 симовол из букв латинского алфавита, цифр и символов -._~.
Вычислите code_challenge:
code_challenge = BASE64URL(SHA256(ASCII(code_verifier)))В Base64 URL Encoding не должно быть символов заполнения =.
Пример:
code_verifier: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
code_challenge: E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cMШаг 2. Сформируйте запрос на авторизацию
Перенаправьте пользователя на форму авторизации Флида ID:
GET https://id.flida.ru/oauth2/authorizeПараметры строки запроса
| Параметр | Описание |
|---|---|
client_id | Обязательный. Идентификатор проекта из консоли Флида ID. Пример: 019d9a8a-7f8b-7f54-9d4e-4a9ecc9fc609 |
redirect_uri | Обязательный. Адрес возврата пользователя. Он должен совпадать с одним из адресов в разделе Платформы | Web в настройках проекта. Пример: https://myapp.ru/callback |
state | Обязательный. Криптографически случайная строка длиной до 255 символов для защиты от CSRF. Флида ID вернет значение без изменений. Пример: CNTMQS56FJLNBRKWIC5KGMRH2R |
response_type | Обязательный. Всегда передавайте code. |
code_challenge | Обязательный. SHA-256-хеш code_verifier, закодированный в Base64 URL Encoding без =. |
code_challenge_method | Обязательный. Всегда передавайте S256. |
scope | Необязательный. Значения scope, разделенные пробелами. openid и offline_access можно не передавать: ID- и refresh-токены выдаются всегда. |
Пример URL
Значения параметров должны быть URL-кодированы:
GET https://id.flida.ru/oauth2/authorize?client_id=019d9a8a-7f8b-7f54-9d4e-4a9ecc9fc609&redirect_uri=https%3A%2F%2Fmyapp.ru%2Fcallback&state=CNTMQS56FJLNBRKWIC5KGMRH2R&response_type=code&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM&code_challenge_method=S256&scope=name%20emailДоступные значения scope
Запрашивать можно только значения scope, предварительно разрешенные в настройках проекта.
| Scope | Данные |
|---|---|
name | Имя, фамилия и, если указано, отчество. |
nickname | Отображаемое имя. Может быть сгенерировано на основе ФИО. |
date_of_birth | Дата рождения в формате YYYY-MM-DD. |
sex | Пол: female или male. |
phone | Номер телефона и признак его подтверждения. |
email | Адрес электронной почты и признак его подтверждения. |
Шаг 3. Обработайте ответ
Успешная авторизация
Флида ID вернет 302 Found с параметрами code и state:
HTTP/1.1 302 Found
Location: https://myapp.ru/callback?code=gTqEcwBiRN3VE2ttxc...&state=CNTMQS56...code— обменяйте его на токены сразу после получения.state— значение из исходного запроса.
Сравните полученный state с сохраненным исходным значением. Если они отличаются, прервите процесс.
Далее выполните сценарий получения токенов.
Ошибки авторизации
Если client_id и redirect_uri прошли проверку, Флида ID перенаправит пользователя на redirect_uri с параметрами error, error_description и исходным state, если его удалось корректно обработать:
HTTP/1.1 302 Found
Location: https://myapp.ru/callback?error=access_denied&error_description=consent%20is%20not%20granted&state=CNTMQS56...| Ошибка | Что означает | Что делать проекту |
|---|---|---|
access_denied | Пользователь не предоставил проекту доступ к запрошенным данным. | Завершить сценарий и сообщить пользователю, что доступ не предоставлен. |
invalid_request | Отсутствует обязательный параметр или его значение некорректно. | Проверить state, PKCE и остальные параметры запроса. |
invalid_scope | Запрошено неизвестное или не разрешенное проекту значение scope. | Запрашивать только значения из настроек проекта. |
login_required | У пользователя нет активной сессии Флида ID. | Начать вход пользователя и повторить авторизацию. |
unsupported_response_type | Значение response_type отличается от code. | Передать response_type=code. |
server_error | Флида ID не смог обработать запрос из-за внутренней ошибки. | Предложить пользователю повторить попытку позже. |
Если невозможно безопасно определить адрес перенаправления, например из-за неизвестного client_id или неверного redirect_uri, сервер вернет JSON без перенаправления:
{
"error": "invalid_request",
"error_description": "invalid client_id"
}В этом случае возможны статусы 400 Bad Request и 500 Internal Server Error.