Пожалуйста, потерпите меня, пока я объясню свою проблему и найденные решения / руководства.
Описание: В моей компании у нас есть один продукт с несколькими модулями . Каждый модуль имеет свой отдельный бэкэнд и интерфейс. У нас есть JavaEE / JakartaEE с JAX-RS в качестве нашего стека и React как для нашего интерфейса. До сих пор мы использовали Basi c Authentication с использованием JavaEE Security через Sessions, но поскольку продукт развивается и нам нужны мобильные клиенты и мы позволяем третьим сторонам получать доступ к данным, мы решили интегрировать OAuth2 / OpenID Connect в наше приложение.
Поскольку существует несколько реализаций, обеспечивающих функциональность OAuth2, в настоящее время мы рассматриваем несколько доступных вариантов. ( Keycloak и ORY Hydra , например). Решение, которое мы выберем, зависит от того, сколько работы мы хотим сделать, чтобы изменить существующую структуру приложения и то, как мы обрабатываем пользователей в базе данных. Но независимо от того, какую реализацию мы выбираем, у нас будут похожие вопросы в будущем.
Вопросы
Как реагирующие приложения обрабатывают процесс входа в систему и хранилище токенов?
Каждая документация гласит: Если пользователь не вошел в систему, он / она перенаправляется на страницу входа. Где после входа в систему и согласия он перенаправляется обратно в приложение (очевидно, после завершения рабочего процесса oauth2) с токеном Access / ID для сервера ресурсов и / или Refre sh токен для обновления токена Access / ID.
Теперь вот что мне не ясно:
Поскольку это наше собственное приложение React, мы не хотим показывать экран согласия, как в приложениях от Microsoft / Google et c вы не видите ни одного. Я предполагаю, что это возможно, установив значение в самом запросе или пропустив экран согласия на основе идентификатора клиента, но я просто хочу убедиться.
Далее, где я должен хранить доступ и ссылка sh токен? Токен доступа следует отправлять как токен на предъявителя при каждом запросе. Таким образом, он может храниться в локальном хранилище, поскольку они недолговечны, но токен refre sh должен храниться надежно. Как в безопасном http cook ie ?. Если это так, то сервер должен установить его. Если это правильно, то как будет выглядеть поток?
Our React App (Not logged In)
-> Login Page (Another React Page)
-> User Enters Credentials
-> Java Backend
-> Authenticates the user
-> Initiate the OAuth2 process
-> Get the Access and Refresh Tokens
-> Set them as secure Cookies
-> Return the authenticated response to frontend with the cookies
-> Login Page redirects to the previous page
-> User continues with the app
Это не правильно. Как PKCE поможет в этом случае?
Предполагая, что то, что я написал выше, правильно, мне потребуются разные потоки входа, когда пользователи входят в систему из нашего собственного приложения или из стороннего приложения. Однако это можно определить, проверив идентификаторы клиентов или отключив поток паролей для сторонних клиентов.
То же самое применимо и к потоку токенов refre sh. Поскольку для моего собственного приложения я должен установить файлы cookie, для третьих лиц это должно быть непосредственно с OAuth-сервера
Ресурсы, которые я прочитал / исследовал:
https://gist.github.com/mziwisky/10079157
Как работает OAuth?
Редактировать: Добавление дополнительных ссылок, которые я прочитал
Какова цель неявного предоставления
Лучшие практики для управления сеансами
RESTful-аутентификация
И, конечно, различные сочинения и примеры из Keycloak и ORY Hydra.
В настоящее время я пробую и Keycloak, и ORY Hydra, чтобы выяснить, что лучше соответствует нашим потребностям.
Спасибо всем заранее!