Как можно наиболее просто настроить единую систему аутентификации (SSO)?

Как можно реализовать механизм однопользовательской авторизации (SSO) в веб-приложении с нуля?
  • 15 января 2024 г. 16:48
Ответы на вопрос 3
Настройка единой системы аутентификации (Single Sign-On, SSO) требует определенных технических знаний и понимания безопасности аутентификации и авторизации. Если вы хотите реализовать SSO с нуля, вам понадобится разработать систему, которая позволяет пользователям входить один раз, а затем получать доступ к нескольким связанным приложениям без необходимости повторной аутентификации. Вот базовые шаги, которые нужно пройти при реализации SSO:

### Планирование и Разработка Архитектуры SSO

1. **Выбор протокола аутентификации**: Выберите протокол, который будет использоваться для аутентификации пользователей, такой как OAuth, OpenID Connect, SAML, JWT и т.д. OpenID Connect (расширение OAuth) и SAML являются популярными выборами для SSO систем.

2. **Определение доверенных доменов**: Определите, какие домены или приложения будут использоваться в рамках SSO. Вам нужно будет установить доверенное взаимодействие между этими доменами.

3. **Централизованное хранилище учетных данных**: Создайте или используйте существующую базу данных для хранения учетных записей пользователей и обеспечьте их безопасное хранение.

4. **Создание поставщика удостоверений (Identity Provider, IdP)**: Вам потребуется разработать или использовать существующий IdP, который будет отвечать за аутентификацию пользователей и выдачу токенов для доступа к приложениям.

5. **Клиенты / Сервис-Провайдеры**: Ваше приложение или сервис должен действовать как клиент или сервис-провайдер (Service Provider, SP), настраивая запросы на аутентификацию и обработку ответов от IdP.

### Реализация механизма SSO

1. **Аутентификация**: Когда пользователь пытается войти в одно из приложений, он перенаправляется к IdP для аутентификации.

2. **Сессионные токены и куки**: После успешной аутентификации IdP выдает сессионный токен или куки, которые клиент сохраняет для подтверждения статуса аутентификации в других приложениях.

3. **Переадресация обратно**: После получения токена пользователя перенаправляют обратно в приложение, где может быть установлена пользовательская сессия.

4. **Валидация токена**: Каждое приложение должно валидировать токен, полученный от пользователя, убедившись, что он был выдан надежным IdP и не истек.

5. **Вход без повторной аутентификации**: Если пользователь уже вошел в систему и пытается обратиться к другому приложению в рамках SSO, эти действия должны происходить без повторной аутентификации.

### Соблюдение Безопасности

- Соблюдайте принципы безопасного программирования и обеспечьте защиту от таких угроз, как CSRF, XSS, инжекции и других уязвимостей.
- Используйте HTTPS для обеспечения безопасности транзитных данных.
- Рег
Самый популярный фреймворк для SSO - OAuth. 
Про него много где уже писали. Например, вот некоторые ссылки:
- https://habr.com/ru/articles/77648/
- https://habr.com/ru/companies/vk/articles/115163/
- https://oauth.net/2/

Также есть еще и OpenID Connect. Это фреймворк построенный вокруг OAuth:
- https://habr.com/ru/companies/nixys/articles/566910/
- https://openid.net/developers/how-connect-works/

Поймешь как они решают эту проблему - поймешь как решить свою.
На вопрос прямого ответа не дам - много букв
"Мой основной затык сейчас в том, что я не понимаю, каким образом myservice2.com узнает о том, что пользователь был залогинен на myservice1.com, как сделать это "бесшовно" для пользователя?"

Так при переходе от сервиса 1 к сервису 2 в параметрах (query string, header или body) передается JWT токен и Refresh токен. Сами токены подписаны сертификатом вашего Auth сервиса и ваш auth сервис предоставляет public key для проверки, как правило по пути "/.well-known/openid-configuration"
Похожие вопросы