Внедрение единого входа на нескольких сайтах

Node.js
Внедрение единого входа на нескольких сайтах

Сегодня я напишу статью о реализации единого входа под несколькими доменными именами.

Существует сценарий, когда компания имеет несколько сайтов с разными доменными именами. Мы ожидаем, что пользователи будут входить в систему, когда они открывают другие сайты после входа на любой сайт. Этот процесс называется единым входом.

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

Что необходимо для единого входа, так это то, что после входа на сайт его статус входа будет синхронизирован с несколькими другими сайтами.

Мы разделим его на две части: сначала мы поговорим о процессе входа на один сайт, а затем поговорим о процессе синхронного состояния входа.

Архитектура, связанная с входом в систему

  • использование сервераnodejs, кеш используетredis.
  • Учетные данные пользователя основаны наsessionизcookiesподдерживать, приниматьcookieВ настоящее время учетные данные для входа в систему являются более распространенным способом.
  • sessionдля информацииredisПодшипник, с уровня данных,redisсредний накопительsessionобъектkeyявляетсяcookieсерединаvalue
  • keyКUUIDСгенерированный уникальный идентификатор
  • чтобы убедиться, чтоsessionа такжеcookieпродолжай переписываться,sessionСоздание и изменение объекта заставит сервер писать в браузер.cookie

Процесс входа

Давайте сначала посмотрим на процесс входа на один сайт

  1. Когда пользователь открывает сайт в первый раз, сервер генерируетsessionобъект, в настоящее времяsessionНа сервере нет информации о пользователе, и сервер пишет в браузерcookie
  2. Пользователь инициирует действие входа
  3. После того, как параметры проверки на стороне сервера обрабатывают логику входа в систему, создается информация о пользователе, и информация о пользователе записывается вsessionобъект, обновить кешredisНарисуем картинку следующим образом

login

Синхронизированное состояние входа

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

Поэтому синхронное состояние входа в систему на самом деле, как синхронизироватьsessionЭта проблема.

и нашsessionсостоит в том, чтобы принятьredisВ качестве перевозчика, пока другие сайты могут получитьredisинформация о пользователе хранится в , вы можете создать свой собственныйsessionОбъекты, которые?

Вот так! Как синхронизироватьsession, становится, как получить другие сайты отredisдля получения информации о пользователе вredis key

На данный момент проблема, которую нам нужно решить, очевидна: как передавать учетные данные пользователя между разными сайтами.

Для простоты описания предположим, что существует два сайта: сайт А и сайт Б. Поскольку доменные имена сайтов A и B различаются в соответствии с политикой одного и того же происхождения,cookieИм нельзя поделиться, поэтому мы берем на себя инициативу запрашивать и передавать уникальные учетные данные пользователя через интерфейс. Общий процесс выглядит следующим образом

  1. После того, как сайт А завершит логическую логику, верните учетные данные пользователя в браузер.В целях безопасности перед передачей учетных данных учетные данные шифруются, и их можно использовать.AESилиRSA
  2. После того, как клиент сайта A получает учетные данные, он вызывает интерфейс синхронного входа, предоставляемый сайтом B, и передает учетные данные.
  3. Сервер сайта B получает учетные данные, расшифровывает их, запрашивает информацию о пользователе в кеше и создаетsessionобъект, записанный на доменное имя сайта BcookieИнформация
  4. Синхронизация статуса входа сайта B завершена.

Опираясь на приведенный выше рисунок, улучшаем временную диаграмму синхронизации

Сценарий синхронизированного входа

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

Страницы на сайте B делятся на два типа, к одной можно получить доступ только войдя в систему, а к другой можно получить доступ без входа в систему.

В первом случае нужно перенаправить на сайт А, но зачем возвращаться на сайт А? Поскольку мы не знаем, недействителен ли в настоящее время статус входа на сайт А, нам нужно вернуться к сайту А, чтобы оценить текущий статус входа на сайт А. Если статус входа на сайт А также недействителен, то перейдите на страницу входа, чтобы снова войти в систему.У сайта А есть состояние входа, поэтому вам нужно только выполнить синхронную операцию состояния входа.

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

Нарисуем картинку, чтобы было понятнее, вот так

login-page

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

междоменный запрос

Поскольку вы хотите запросить интерфейс под доменным именем B на сайте A, возникнут междоменные проблемы.

  1. JSONPОчень распространенный и общий способ
  2. ImageиспользоватьImage srcПолитику одного и того же происхождения можно обойти, поэтому, создавImageОтправка запроса также возможна, и серверу не нужно делать много изменений.
  3. CORSСтарые браузеры не поддерживают его, вам нужно установить его на стороне сервераAccess-Control-Allow-Origin, что позволяет запросам, инициированным любым доменом или указанным доменом, получать данные текущего сервера.

дизайн объекта сеанса

Сервер в основном вращается вокругsessionРасширение объекта, я подробно писал статью ранее на основеkoa2выполнитьsessionПринцип и конкретная реализация, портал:Node Project — создание отличного механизма сеанса

резюме

Статья в основном основана на плане, поэтому подробный код ставить не буду, на самом деле при конкретном плане реализация кода не представляет сложности.

Должны быть другие отличные решения для единого входа на несколько сайтов.Приглашаем друзей обменяться мнениями и обсудить их в комментариях~