Какой самый простой способ организовать SSO?

Собственно, в бэкендах я ноль, но сам для себя кручу-верчу разные проектики и пытаюсь решить следующую, достаточно сложную, но и достаточно базовую задачу: SSO.

У меня есть несколько сервисов, но я хочу вынести управление пользователями в отдельный. Цель простая - зарегался в одном, можешь входить в любые.

Но на этапе реализации, если пока отбросить секьюрити и прочее, возникает несколько вопросов.

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

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

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

С точки зрения UX тоже много вопросов. Оставлять ли индивидуальные формы логина/регистрации на сервисах или редиректить на единый интерфейс? Первый вариант предпочтительнее, конечно.

Использую Golang и хотелось бы реализовать это с помощью JWT, но это так, тонкости.
  • Вопрос задан
  • 1014 просмотров
Пригласить эксперта
Ответы на вопрос 4
AshBlade
@AshBlade
Просто хочу быть счастливым
Самый популярный фреймворк для 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/

Поймешь как они решают эту проблему - поймешь как решить свою.
На вопрос прямого ответа не дам - много букв
Ответ написан
Комментировать
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
Дополню, если хочется сделать именно свою реализацию, то вот тут я уже отвечал как именно это делается: Как сделать единый аккаунт для своих сервисов?
spoiler

5bd748db6d572869658821.png
Ответ написан
Комментировать
Для начала советую посмотреть OpenID Connect, до полного просветления. Для экспериментов (а может и для прода, смотря какие у вас требования) можно взять Keycloak в качестве сервера аутентификации.
Когда разберётесь с этим, и соберёте готовую лабораторную, поймёте что нужно изменить именно под вас.
Ответ написан
Комментировать
petermzg
@petermzg
Самый лучший программист
"Мой основной затык сейчас в том, что я не понимаю, каким образом myservice2.com узнает о том, что пользователь был залогинен на myservice1.com, как сделать это "бесшовно" для пользователя?"

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы