Собственно, в бэкендах я ноль, но сам для себя кручу-верчу разные проектики и пытаюсь решить следующую, достаточно сложную, но и достаточно базовую задачу: SSO.
У меня есть несколько сервисов, но я хочу вынести управление пользователями в отдельный. Цель простая - зарегался в одном, можешь входить в любые.
Но на этапе реализации, если пока отбросить секьюрити и прочее, возникает несколько вопросов.
Как вообще блин это нормально организовать?? Мой основной затык сейчас в том, что я не понимаю, каким образом myservice2.com узнает о том, что пользователь был залогинен на myservice1.com, как сделать это "бесшовно" для пользователя? Попытался поревёрс инжинирить как это сделано здесь, на хабре, но зацепок не удалось обнаружить, а мне примерно то же самое и нужно.
В голову приходит примитивный вариант, когда всё разруливается через редиректы на сервис аутентификации, но такой подход кажется избыточным, хотя в больших сервисах примерно так и происходит, но это добавляет огромную задержку.
Вопрос получается сумбурный, прошу прощения, не знаю как лучше его сформировать. Понимаю, что вопросы подобного вида тут не приветствуются, но и спросить больше не у кого. Плюс вся инфа в интернете, что я нахожу, либо слишком поверхностная, либо слишком детальная энтерпрайз уровня. Мне же нужно самое тупое, самое просто решение, "в лоб". Буду признателен, если кто-то более опытный сможет накидать самый простой алгоритм того, как это должно работать.
С точки зрения UX тоже много вопросов. Оставлять ли индивидуальные формы логина/регистрации на сервисах или редиректить на единый интерфейс? Первый вариант предпочтительнее, конечно.
Использую Golang и хотелось бы реализовать это с помощью JWT, но это так, тонкости.
Для начала советую посмотреть OpenID Connect, до полного просветления. Для экспериментов (а может и для прода, смотря какие у вас требования) можно взять Keycloak в качестве сервера аутентификации.
Когда разберётесь с этим, и соберёте готовую лабораторную, поймёте что нужно изменить именно под вас.
"Мой основной затык сейчас в том, что я не понимаю, каким образом myservice2.com узнает о том, что пользователь был залогинен на myservice1.com, как сделать это "бесшовно" для пользователя?"
Так при переходе от сервиса 1 к сервису 2 в параметрах (query string, header или body) передается JWT токен и Refresh токен. Сами токены подписаны сертификатом вашего Auth сервиса и ваш auth сервис предоставляет public key для проверки, как правило по пути "/.well-known/openid-configuration"