Процесс OAuth2 и лучшие практики для частных приложений - PullRequest
3 голосов
/ 24 апреля 2020

Пожалуйста, потерпите меня, пока я объясню свою проблему и найденные решения / руководства.

Описание: В моей компании у нас есть один продукт с несколькими модулями . Каждый модуль имеет свой отдельный бэкэнд и интерфейс. У нас есть JavaEE / JakartaEE с JAX-RS в качестве нашего стека и React как для нашего интерфейса. До сих пор мы использовали Basi c Authentication с использованием JavaEE Security через Sessions, но поскольку продукт развивается и нам нужны мобильные клиенты и мы позволяем третьим сторонам получать доступ к данным, мы решили интегрировать OAuth2 / OpenID Connect в наше приложение.

Поскольку существует несколько реализаций, обеспечивающих функциональность OAuth2, в настоящее время мы рассматриваем несколько доступных вариантов. ( Keycloak и ORY Hydra , например). Решение, которое мы выберем, зависит от того, сколько работы мы хотим сделать, чтобы изменить существующую структуру приложения и то, как мы обрабатываем пользователей в базе данных. Но независимо от того, какую реализацию мы выбираем, у нас будут похожие вопросы в будущем.

Вопросы

  1. Как реагирующие приложения обрабатывают процесс входа в систему и хранилище токенов?

    Каждая документация гласит: Если пользователь не вошел в систему, он / она перенаправляется на страницу входа. Где после входа в систему и согласия он перенаправляется обратно в приложение (очевидно, после завершения рабочего процесса 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 поможет в этом случае?

  2. Предполагая, что то, что я написал выше, правильно, мне потребуются разные потоки входа, когда пользователи входят в систему из нашего собственного приложения или из стороннего приложения. Однако это можно определить, проверив идентификаторы клиентов или отключив поток паролей для сторонних клиентов.

  3. То же самое применимо и к потоку токенов refre sh. Поскольку для моего собственного приложения я должен установить файлы cookie, для третьих лиц это должно быть непосредственно с OAuth-сервера

Ресурсы, которые я прочитал / исследовал:

https://gist.github.com/mziwisky/10079157

Как работает OAuth?

Редактировать: Добавление дополнительных ссылок, которые я прочитал

Какова цель неявного предоставления

Лучшие практики для управления сеансами

RESTful-аутентификация

И, конечно, различные сочинения и примеры из Keycloak и ORY Hydra.

В настоящее время я пробую и Keycloak, и ORY Hydra, чтобы выяснить, что лучше соответствует нашим потребностям.

Спасибо всем заранее!

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020
  1. Вам не нужно показывать экран согласия. Вот пример аутентификации приложения React с использованием гранта кода авторизации: https://fusionauth.io/blog/2020/03/10/securely-implement-oauth-in-react (полное раскрытие, оно на сайте моего работодателя, но будет работать с любым сервером идентификации, совместимым с OAuth2).

Короткий ответ: лучше избегать неявного предоставления, а также иметь токены доступа и refre sh, которые хранятся в промежуточном программном обеспечении, а не в браузере. Пример в ссылке использует 100-строчный express сервер и сохраняет эти токены в сеансе.

Я немного написал о PKCE. Выдержка:

Ключ подтверждения для обмена кодами (PKCE) RF C был опубликован в 2015 году и расширяет грант кода авторизации для защиты от атаки, если часть потока авторизации происходит через не TLS подключение. Например, между компонентами нативного приложения. Эта атака может также произойти, если TLS имеет уязвимость или если микропрограмма маршрутизатора была скомпрометирована и подделывает DNS или понижает TLS до HTTP. PKCE требует отправки дополнительного одноразового кода на сервер OAuth. Это используется для проверки того, что запрос не был перехвачен или изменен.

Вот разбивка различных вариантов OAuth, которые у вас есть (опять же, это на сайте моего работодателя, но будет работать с любым OAuth2-совместимым сервером идентификации): https://fusionauth.io/learn/expert-advice/authentication/login-authentication-workflows Вы можете разрешить разные потоки для разных клиентов , Например, вы можете использовать Предоставление кода авторизации для третьих сторон и предоставление учетных данных пароля владельца ресурса (по сути это имя пользователя и пароль) для ваших собственных приложений.

Я не уверен, что ответил на все из ваших вопросов, но я надеюсь, что это поможет.

0 голосов
/ 25 апреля 2020

Рекомендуется ознакомиться с рекомендациями по безопасности OAuth 2.0 . Несмотря на то, что это все еще «черновик Intex1010», он является зрелым и реализован несколькими реализациями продавцов.

В целом, код авторизации OAuth 2.0 с PKCE Flow является рекомендацией независимо от использования Bearer. токены или JWT.

Вы также должны прочитать о WebAuthn (Там, где нет пароля)

...