# 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

| Parameters                 | Description                                                                                                                                                                                                                                                                                  |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `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

| Parameters                         | Description                                                                                                         |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| `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.
