А как вы реализовываете кроссдоменную авторизацию?
Добрый день, друзья. Интересная для меня задача появилась, в которой у меня опыта пока нет. Хочу сразу сказать, что вопрос не несёт просьбы написать код за меня, а имеет чисто дискуссионный характер, дабы вы подтвердили мои мысли или исправили ошибки в оных.
Задача:
Есть сервер авторизации с хранящимися на нём аккаунтами пользователей, с правами доступами и многим другим. Есть микросервисы в которых нужна авторизация для доступа к правам (собственно к правам для этого микросервиса) и данным. Если входим на одном из сервисов, должны авторизоваться на каждом из других (нюанс опишу позже). Аналогично при выходе. (Физически все микросервисы могут находиться на разных серверах, работать на разных версиях библиотек, работать с разными БД (или вовсе не использовать оную))
Какие у меня мысли:
Авторизацию проводить на стороне сервера авторизаций (пусть как у google - accounts.example.com), после редиректом будем возвращаться на нужный нам сервис. Вложить в html iframe с внейшней ссылкой для проверки\продления сессии (и если сессии нет, то js внутри iframe будет отправлять нас на сервер авторизаций).
Нюанс автоматической авторизации:
Необходимо нажать на кнопку, пользователя перенесёт на сервер авторизации, а оттуда обратно.
Все эти вещи я подсмотрел у google, потому многих вещей я всё ещё не знаю. К примеру:
- Как реализовать сохранение сессии на стороне микросервиса после редиректа, дабы данные не были скомпрометированы? (шифровать?)
- Как хранить сессию на стороне микросервиса? (я думаю, что по старинке, в сессии)
Буду благодарен за любую теорию. Но давайте помнить, что это дискуссия, без хейта, пожалуйста)
Захаров Александр: благодаря вашему комментарию нашёл очень хороший ответ на stackoverflow. Благодарю, там, в принципе, так и описано, как я представил
gubin_niko: Пожалуйста ) Если вам понравился ответ, который вы нашли, может кините сюда ссылку, чтобы другие могли его тоже почитать? Вдруг кому-то ещё пригодится. )
Вы практически описали протокол SAML. То, что вы называете сервером авторизации, в терминологии SAML является Identity Provider (IdP). Остальные сервисы - Service Providers (SP).
При попытке войти на один из SP вас редиректит на IdP для проверки, аутентифицированы вы уже или нет. Если да, то тут же происходит обратный редирект на SP с подписанными данными о вашей аутентифицированной сессии. Если вы не были аутентифицированы, то IdP сначала проверит ваши учетные данные (логин-пароль, OTP или что еще вы настроете), а потом так же произведет перенаправление браузера на SP с подписанной информацией о пользователе и статусе его сессии.
В протоколе SAML реализован single logout.
Благодарю за ответ за термины, будет проще искать нужную информацию! Я сейчас начал писать уже алгоритм, в принципе ничего сложного не осталось. Смущает лишь то, как это сделано у Google. Они в куках хранять очень много разной информации (сразу после входа), и не понятно, для авторизации или для других целей.