Сценарий APP2WEB через webview
Для авторизации в приложении с использованием компонента WebView в Tinkoff ID реализован сценарий APP to WEB.
- Партнер инициализирует запуск WebView с кнопкой "Войти в Тинькофф ID"
- Пользователь инициирует процесс авторизации, нажимая кнопку "Войти с Тинькофф" на сайте или в приложении партнера.
-
Партнерский сервис должен сгенерировать параметр
code_verifier
иcode_challenge_method
, создает его преобразованную версиюcode_challenge
, которая получается с помощью применения преобразованияcode_challenge = code_challenge_method(code_verifier)
, гдеcode_challenge_method
является трансформирующей функцией.- Почитать про хеширование параметра
code_verifier
можно здесь. - Необходимо использовать защиту Proof Key for Code Exchange (PKCE) для предотвращения последствий возможного перехвата кода, данное значение должно быть уникальным для каждого запроса кода авторизации.
- Пример генератора: https://tonyxu-io.github.io/pkce-generator/
- Требуемая генерация: "base64_url(SHA256(code_verifier))"
- Почитать про хеширование параметра
-
Инициализация авторизации осуществляется вызовом метода GET
https://id.tinkoff.ru/auth/authorize
со следующими параметрами:client_id
: идентификатор, который вы получили после регистрацииmobile_redirect_url
(app link в приложение, указанные в анкете)code_verifier
из пункта 3response_type: code
response_mode=query
Пример запроса:
GET https://id.tinkoff.ru/auth/authorize?client_id=%client_id%&redirect_uri=https://myintegration.ru/auth/complete&code_challenge={codeChallenge}&code_challenge_method=S256&response_type=code
-
Отображение экрана аутентификации в Тинькофф id.tinkoff.ru для ввода номера телефона.
- Пользователь вводит данные для прохождения аутентификации.
- Пользователь нажимает на кнопку "Продолжить", соглашаясь с передачей данных. В зависимости от настроек партнерского приложения, у пользователя есть возможность снятия чекбокса с данными, которые он не готов предоставить. Если у пользователя напротив всех полей есть включенный чекбокс, то при нажатии "Продолжить", в следующих авторизациях это окно открываться не будет.
-
На
https://myintegration.ru/auth/complete
придет запрос вида:https://myintegration.ru/auth/complete?code_challenge={codeChallenge}&code_challenge_method=S256&code=c.1aGiAXX3Ni&session_state=hXXXXXXY3kgs3nx0H3RTj3JzCSrdaqaDhU6lS8XXXXX.i4kl6dsEB1SQogzq00
-
По app link происходит переход в партнерское приложение с параметром
code
- Партнерское приложение должно провалидировать параметр
code_verifier
для сверки со значением в первоначальном запросе, если валидация прошла успешно, необходимо забрать значение параметраcode
для дальнейшего обмена на токены. -
Для получения Access и Refresh токенов необходимо вызвать метод POST
https://id.tinkoff.ru/auth/token
. Формат запроса:- Authorization: Basic, где username соответствуют client_id полученному на электронную почту. Примеры составления в разных языках
- Content-type:
application/x-www-form-urlencoded
- grant_type:
authorization_code
- redirect_uri:
mobile_redirect_url
(тот, который был направлен вauthorize
) code_verifier
-
Авторизационный сервер проверяет
code_verifier
на соответствиеcode_challenge
и возвращает токены или отвечает ошибкой.
Пример запроса на получение токена:
curl -X POST \
https://id.tinkoff.ru/auth/token \
-H 'Authorization: Basic ' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'grant_type=authorization_code&redirect_uri=https://myintegration.ru/auth/complete&code=c.1aGiAXX3Ni'
Пример ответа:
{
"access_token": "t.mzucgRIDwalXXX_at2Y2kmJB6yhNAQlWMNucp3w45xMcKknxWyl_XXXXkp5_3Nq8i_UvddDroJvd3elz-QH5hQ",
"token_type": "Bearer",
"expires_in": 1791, // Время жизни токена в секундах
"refresh_token": "LShO9uuXXXXqozxO8WP2eGsJpXXXX-3QBGYUeNzUv4LTtjudU6zPofXbiXXXoznuCOLv6XXXCJn04fsLvsYH2Q"
}