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 |
---|---|
| Установлен в |
| |
| Вообще, рекомендуется. Куда хотим перенаправить пользователя после успешной авторизации. Обязан совпадать с Redirect URI, что мы указали при регистрации клиента OAuth |
| Одно или несколько значений, разделенных пробелом |
| Выполняет две функции: это ключ сессии (может использоваться как параметр состояния или для понимания, куда редиректнуть пользователя) и CSRF-токен (если для каждого запроса это значение уникально; необходимо перепроверять, что значение state не изменилость между запросом и ответом). |
Обратите внимание, что отсутствие использования секрета клиента означает, что использование параметра состояния еще более важно для одностраничных приложений.
Exchange the authorization code for an access token
Parameters | Description |
---|---|
| Установлен в |
| |
| Если параметр был включен в предыдущий запрос, то должен быть включен и в этот |
| Обязательно включение для идентификации клиента. Должен быть включен как 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