Сегодня я напишу статью о реализации единого входа под несколькими доменными именами.
Существует сценарий, когда компания имеет несколько сайтов с разными доменными именами. Мы ожидаем, что пользователи будут входить в систему, когда они открывают другие сайты после входа на любой сайт. Этот процесс называется единым входом.
Поскольку на нескольких сайтах используется один и тот же набор пользовательских систем, единый вход может устранить необходимость повторного входа пользователей в систему, позволяя пользователям переключаться между сайтами более плавно и даже незаметно.
Что необходимо для единого входа, так это то, что после входа на сайт его статус входа будет синхронизирован с несколькими другими сайтами.
Мы разделим его на две части: сначала мы поговорим о процессе входа на один сайт, а затем поговорим о процессе синхронного состояния входа.
Архитектура, связанная с входом в систему
- использование сервера
nodejs
, кеш используетredis
. - Учетные данные пользователя основаны на
session
изcookies
поддерживать, приниматьcookie
В настоящее время учетные данные для входа в систему являются более распространенным способом. -
session
для информацииredis
Подшипник, с уровня данных,redis
средний накопительsession
объектkey
являетсяcookie
серединаvalue
-
key
КUUID
Сгенерированный уникальный идентификатор - чтобы убедиться, что
session
а такжеcookie
продолжай переписываться,session
Создание и изменение объекта заставит сервер писать в браузер.cookie
Процесс входа
Давайте сначала посмотрим на процесс входа на один сайт
- Когда пользователь открывает сайт в первый раз, сервер генерирует
session
объект, в настоящее времяsession
На сервере нет информации о пользователе, и сервер пишет в браузерcookie
- Пользователь инициирует действие входа
- После того, как параметры проверки на стороне сервера обрабатывают логику входа в систему, создается информация о пользователе, и информация о пользователе записывается в
session
объект, обновить кешredis
Нарисуем картинку следующим образом
Синхронизированное состояние входа
После того, как сайт завершит вход в систему, следующим шагом будет то, как сделать так, чтобы другие сайты также имели состояние входа.
Поскольку состояние входаcookie
а такжеsession
решил, иcookie
снова поsession
написано, то есть до тех пор, покаsession
Синхронизируется с другими сайтами, другим сайтам нужно только получитьsession
, вы можете создать или обновить в этом доменеcookie
, чтобы два сайта под разными доменными именами имели одинаковую информацию для входа.
Поэтому синхронное состояние входа в систему на самом деле, как синхронизироватьsession
Эта проблема.
и нашsession
состоит в том, чтобы принятьredis
В качестве перевозчика, пока другие сайты могут получитьredis
информация о пользователе хранится в , вы можете создать свой собственныйsession
Объекты, которые?
Вот так! Как синхронизироватьsession
, становится, как получить другие сайты отredis
для получения информации о пользователе вredis key
На данный момент проблема, которую нам нужно решить, очевидна: как передавать учетные данные пользователя между разными сайтами.
Для простоты описания предположим, что существует два сайта: сайт А и сайт Б. Поскольку доменные имена сайтов A и B различаются в соответствии с политикой одного и того же происхождения,cookie
Им нельзя поделиться, поэтому мы берем на себя инициативу запрашивать и передавать уникальные учетные данные пользователя через интерфейс. Общий процесс выглядит следующим образом
- После того, как сайт А завершит логическую логику, верните учетные данные пользователя в браузер.В целях безопасности перед передачей учетных данных учетные данные шифруются, и их можно использовать.
AES
илиRSA
- После того, как клиент сайта A получает учетные данные, он вызывает интерфейс синхронного входа, предоставляемый сайтом B, и передает учетные данные.
- Сервер сайта B получает учетные данные, расшифровывает их, запрашивает информацию о пользователе в кеше и создает
session
объект, записанный на доменное имя сайта Bcookie
Информация - Синхронизация статуса входа сайта B завершена.
Опираясь на приведенный выше рисунок, улучшаем временную диаграмму синхронизации
Сценарий синхронизированного входа
Выше описан процесс синхронизации, когда пользователь входит в систему в первый раз. Необходимо рассмотреть и другие сценарии. Например, статус входа, полученный сайтом Б, недействителен. В это время, при доступе к странице сайта Б, вам нужно перейти на сайт А для синхронизации статуса входа.
Страницы на сайте B делятся на два типа, к одной можно получить доступ только войдя в систему, а к другой можно получить доступ без входа в систему.
В первом случае нужно перенаправить на сайт А, но зачем возвращаться на сайт А? Поскольку мы не знаем, недействителен ли в настоящее время статус входа на сайт А, нам нужно вернуться к сайту А, чтобы оценить текущий статус входа на сайт А. Если статус входа на сайт А также недействителен, то перейдите на страницу входа, чтобы снова войти в систему.У сайта А есть состояние входа, поэтому вам нужно только выполнить синхронную операцию состояния входа.
Во втором случае, несмотря на то, что страницу B можно просматривать без логин-статуса, корпоративный сайт часто помечает логин-статус пользователя в шапке страницы, поэтому, чтобы эта часть отображалась нормально, мы асинхронно обновляем логин-статус на текущем состоянии страницы может быть.
Нарисуем картинку, чтобы было понятнее, вот так
Если есть другие сценарии, то логика обработки аналогична этой, суть в том, чтобы один раз получить сертификат и снова обновить кеш сайта.
междоменный запрос
Поскольку вы хотите запросить интерфейс под доменным именем B на сайте A, возникнут междоменные проблемы.
-
JSONP
Очень распространенный и общий способ -
Image
использоватьImage src
Политику одного и того же происхождения можно обойти, поэтому, создавImage
Отправка запроса также возможна, и серверу не нужно делать много изменений. -
CORS
Старые браузеры не поддерживают его, вам нужно установить его на стороне сервераAccess-Control-Allow-Origin
, что позволяет запросам, инициированным любым доменом или указанным доменом, получать данные текущего сервера.
дизайн объекта сеанса
Сервер в основном вращается вокругsession
Расширение объекта, я подробно писал статью ранее на основеkoa2
выполнитьsession
Принцип и конкретная реализация, портал:Node Project — создание отличного механизма сеанса
резюме
Статья в основном основана на плане, поэтому подробный код ставить не буду, на самом деле при конкретном плане реализация кода не представляет сложности.
Должны быть другие отличные решения для единого входа на несколько сайтов.Приглашаем друзей обменяться мнениями и обсудить их в комментариях~