#ruby-on-rails #reactjs #openid-connect
#ruby-на-рельсах #reactjs #OpenID-connect
Вопрос:
В потоке OIDC (PKCE) как безопасно сгенерировать code_challenge из code_verifier. Должен ли я генерировать в ReactJS SPA или в моих Rails в качестве серверного приложения.
Я не уверен, где сгенерировать это в SPA ReactJS или в приложении Rails.
- Если я создаю в ReactJS SPA, то где хранить этот code_verifier в браузере для следующего вызова токена в / token api IDP (okta) по соображениям безопасности?
- Если я создаю в приложении backend Rails, то есть ли какие-либо риски безопасности?
Справочный документ для вызова API для завершения потока OIDC: https://developer.okta.com/docs/reference/api/oidc/#token
Ответ №1:
PKCE всегда должен генерироваться там, откуда выдается первоначальный запрос на аутентификацию. Итак, если это делается из вашего приложения для браузера SPA, тогда оно также должно сгенерировать code_verifier и code_challenge.
Комментарии:
1. Нажмите на что? где? это ваше приложение SPA или приложение Rails, которое инициирует поток с вашим поставщиком удостоверений?
2. сценарий для потока oidc PKCE без пользователя: — пользователь нажимает кнопку входа в систему (запускается поток oidc), который заменяет URL-адрес браузера на конечную точку авторизации, чтобы получить код на основе настроек конфигурации oidc для url. — в этом случае я должен сгенерировать code_challenge из code_verifier (где надежно хранить code_verifier в браузере, чтобы я мог выполнить следующий вызов конечной точки /token для получения access_token). —
3. извините, что в первую очередь кнопка добавления комментария была нажата непреднамеренно. У меня есть приложение react, которое получает конфигурации oidc для различных поставщиков единого входа с сервера (мое приложение rails), а приложение react отображает кнопки входа в систему со связанными конфигурациями (oidc, saml 2.0).
4. тогда я предполагаю, что PKCS следует обрабатывать в браузере.
Ответ №2:
Цель PKCE — убедиться, что клиент, который инициировал запрос на авторизацию, является тем же клиентом, который в конечном итоге обменивает код авторизации на токен доступа. Таким образом, проверка кода и вызов должны быть созданы клиентом, который отправляет эти запросы на сервер авторизации (запрос авторизации и запрос токена). Похоже, что в вашем случае это SPA.
Что касается того, где хранить верификатор, его можно безопасно хранить в хранилище сеансов. Другим способом было бы сохранить его в памяти (например, в состоянии приложения React) и выполнить поток аутентификации во всплывающем окне или iframe, чтобы ваше приложение не нужно было перезагружать. (для OIDC существуют интерфейсные библиотеки, которые могут выполнять авторизацию во всплывающем окне или iframe, например, вы можете взглянуть на oauth-assistant).