@maksam07

Как авторизовавшись на одном сайте в «сети сайтов», быть автоматически авторизованным и на других?

Добрый день. Вопрос не совсем о OAuth2. Самый банальный пример на гугле. Ты можешь в поисковике войти в свой аккаунт, но при открытии почты/ютуба/и т.д. ты везде становишься авторизованным автоматически. Хотя это все разные домены, скорее всего и на разных серверах. Есть ли какая-то простая схема связи между сайтами, чтобы при авторизации на одном из, ты считался авторизованным на всех?
  • Вопрос задан
  • 100 просмотров
Решения вопроса 2
Vamp
@Vamp
Видел однажды такую реализацию.

При успешном прохождении авторизации кидает на страницу, где через тег img подключается "картинка" с каждого домена, участвующего в sso тусовке.

<h2>Вы успешно вошли</h2>
<img src="https://example.com/auth.php?key=1hB7fa014bbXCDg920">
<img src="https://example.net/auth.php?key=hVVFD41looas8730MM">
<img src="https://example.org/auth.php?key=QnaVBhj7mqwaBK9xq6">

При авторизации создаётся и записывается в базу пачка одноразовых временных токенов, привязанных к только что авторизованному пользователю. При загрузке auth.php проверяется этот токен (передается через key в примере выше) и если токен ещё не просрочился, то выдаётся однопиксельный прозрачный gif с авторизационным кукисом. Этот кукис привязывается к домену, с которого загружается картинка.
Ответ написан
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
Два пути. Приложение может быть без сессии и с сессией.

Если сессия (то есть перезагрузка страницы, без апи) - то куки можно ставить на группу доменов. Общая кука для всех под-доменов.

Если сессии нет - то есть такая штука JWT token и в ней есть audience/issued, который делает примерно то же самое (выдан для/выдан кем). Аудиенции это как раз сайты (точнее будет сказать - места), где этот токен будет приниматься, опять же - с общим сервером авторизации.

JWT токен сделан для того, чтобы не хранить в БД все разрешения выданные всем юзерам, которых может быть за миллион. В базе хранятся только токены добавленные в черный список в силу того, что человек их сам обнулил сделав "logout" (выйди из системы) или "revoke" (переделав конкретный токен поновой, чтобы старый пока срок не кончится - не работал).

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

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

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