Single Page App Auhtorization Flow

About

Single-page приложения (или browser-based приложения) - запускаются в браузере после подгрузки JS/HTML. Тк код загружается в браузере клиента, то сохранить client secret в тайне не получится. Следовательно, он не используется в SPA. Flow такой же, как Authorization Code Flow, но на последнем шаге authorization code обменивается на access-токен без использования client secret.

Authorization Grant Parameters

ParametersDescription

response_type (required)

Установлен в code

client_id (required)

redirect_uri (optional)

Вообще, рекомендуется. Куда хотим перенаправить пользователя после успешной авторизации. Обязан совпадать с Redirect URI, что мы указали при регистрации клиента OAuth

scope (optional)

Одно или несколько значений, разделенных пробелом

state (recommended)

Выполняет две функции: это ключ сессии (может использоваться как параметр состояния или для понимания, куда редиректнуть пользователя) и CSRF-токен (если для каждого запроса это значение уникально; необходимо перепроверять, что значение state не изменилость между запросом и ответом).

Обратите внимание, что отсутствие использования секрета клиента означает, что использование параметра состояния еще более важно для одностраничных приложений.

Exchange the authorization code for an access token

ParametersDescription

grant_type (required)

Установлен в authorization_code

code (required)

redirect_uri (possible required)

Если параметр был включен в предыдущий запрос, то должен быть включен и в этот

client_id (required)

Обязательно включение для идентификации клиента. Должен быть включен как POST-парамент, а не HTTP Basic Auth Header

Implicit Flow

Некоторые сервисы используют этот альтернативный Flow. Он пропускает этап обмена authorization code на access-токен, а сразу получает его в query-параметре на шаге Authorization Grant.

На практике это необходимо лишь в очень ограниченных случаях. Несколько основных реализаций (Keycloak, Deutsche Telekom, Smart Health IT) решили полностью избежать Implicit Flow и вместо этого использовать Authorization Code Flow.

Security

Чтобы SPA могло использовать Authorization Code Flow, оно должно быть способно отправлять POST-запросы => на стороне сервера должен быть настроен CORS (если сервер авторизации находится на другом домене). Если поддержка CORS-заголовков не вариант, тогда сервис может использовать Implicit Flow.

В любом случае, как с Implicit Flow, так и с Authorization Code Flow без client secret, сервер должен требовать регистрации Redirect URL, чтобы поддерживать безопасность flow.

Единственный способ обеспечить безопасность Authorization Code Grant без client secret - это использование параметра state и ограничение Redirect URL для доверенных клиентов. Поскольку секрет не используется, нет другого способа проверить личность клиента, кроме как с помощью зарегистрированного Redirect URL. Вот почему вам необходимо предварительно зарегистрировать Redirect URL в службе OAuth 2.0.

Last updated