Мы предлагаем ряд онлайн-сервисов. От нас требуется разработать систему, которая обеспечивает быстрый / простой опыт для пользователей, если они переводятся с одной службы (на domain1.com) на другую (на domain2.com).
Есть ли безопасный и надежный способ автоматического входа пользователя в систему после того, как он был переведен в новую службу?
Кричите на меня, если приведенное ниже решение полностью небезопасно / неверно.
Мы рассматривали систему, аналогичную той, что предоставляется рядом онлайн-сервисов для восстановления пароля - им по электронной почте отправляется ссылка с уникальным хешем, срок действия которого истекает, что позволяет им изменить свой пароль.
Сайт domain1.com сгенерирует уникальный хэш и сохранит его в базе данных с хешем, связанным с пользователем, вместе с полем даты и времени истечения срока действия.
Пользователь будет переведен на domain2.com/auto/?hash=d41d8cd98f00b204e9800998ecf8427e
Затем domain2.com отправит запрос к domain1.com с хешем, чтобы получить информацию о пользователе. domain1.com затем удалит хеш из базы данных. domain2.com будет регистрировать пользователя и устанавливать файлы cookie и т. д.
Может ли что-то, основанное на OpenID или OAuth, достичь тех же результатов?

Если бы кто-то смог сыграть человека посередине и захватить этот хеш, смог бы он украсть передачу между доменами? Очевидно, что его нужно сгенерировать и отправить клиенту до того, как им понадобится его использовать. Так скажем, например:
Я играю человека посередине, шпионящего за Джеком.
Джек обращается к domain1.com, что вызывает подготовку и отправку хэша ему, чтобы при доступе к domain2.com он мог отправить этот хеш в качестве аутентификации.
Когда он обращается к domain1.com, его запрос проходит через меня, вы возвращаете страницу, я беру хеш и позволяю ему продолжить.
Я обращаюсь к domain2.com, используя хэш, теперь вы впустили меня в domain2.com и удалили хеш.
Он не станет мудрее, пока не попытается войти в domain2.com и ему не сообщат, что его учетные данные больше не действительны.
Как это преодолеть?
хорошая точка зрения. Теоретически это должно означать, что модель OP должна быть достаточно безопасной, если предположить, что они тогда используют SSL.
Это хорошее решение. Вот два момента, которые следует учитывать:
Вы используете термин «хэш», но неясно, какие данные вы будете хешировать. Вместо этого используйте «одноразовый номер»: большое (128-битное) число, генерируемое ГСЧ криптографического качества.
Кроме того, вы не указали это, но связь между пользователем и обоими доменами, а также между самими доменами должна быть безопасной. Используйте SSL для аутентификации серверов и сохранения конфиденциальности одноразового номера.
Единая точка входа (SSO) концептуально довольно прост.
domain1.com.domain1.com видит, что cookie сеанса нет.domain1.com перенаправляет на sso.comsso.com представляет страницу входа и принимает учетные данныеsso.com устанавливает cookie сеанса для пользователяsso.com затем перенаправляет обратно на domain1 по специальному URL-адресу (например, domain1.com/ssologin)ssologin содержит параметр, который в основном «подписан» sso.com. Это может быть так же просто, как base64 шифрования логина с использованием общего секретного ключа.domain1.com берет зашифрованный токен, расшифровывает его, использует новый идентификатор входа в систему для входа пользователя.domain1 устанавливает cookie сеанса для пользователя.Теперь следующий случай.
domain2.com, который следует за domain1 и перенаправляет на sso.com.sso.com уже имеет файл cookie для пользователя, поэтому не отображает страницу входаsso.com перенаправляет обратно на domain2.com с зашифрованной информациейdomain2.com авторизуется пользователем.Это основы того, как это работает. Вы можете сделать его более надежным, более функциональным (например, это SSOn, но не SSOff, пользователь может «выйти из системы» из domain1, но по-прежнему войти в систему в domain2). Вы можете использовать открытые ключи для подписи учетных данных, у вас могут быть запросы на передачу дополнительной информации (например, прав авторизации и т. д.) С сервера SSO. У вас может быть более тесная интеграция, например, когда домены будут регулярно проверять, что у пользователя все еще есть права с сервера SSO.
Но рукопожатие печенья через браузер с использованием перенаправлений является ключевой основой, на которой основаны все эти решения SSO.
Мне нравится этот метод ... конечно, он полагается на еще один домен для выполнения своей работы. Что добавляет сложности. Однако я сам не могу придумать лучшего решения +1
Что ж, SSO того же домена проще, потому что вам не нужно выполнять махинации с файлами cookie перенаправления. Но это сработает в любом случае.
будьте осторожны с URL-адресом ssologin с параметром "signed" ... если ваш параметр не содержит одноразового номера / отметки времени, кто-то, перехватывающий эту строку запроса, сможет использовать ее для входа. установка всего через SSL смягчит это.
@russau Я собираюсь реализовать этот метод, но мне сложно установить одноразовый номер, где мне его хранить?
@albanx Одноразовые номера - это часть запроса. Вы используете одноразовый номер для проверки действительности запроса. Например, для nonce устанавливается текущее время по Гринвичу, и когда сервер его получает, он может сравнить время nonce с текущим временем. Если ему больше, скажем, 1 минуты, он может отклонить запрос. Но просто добавьте одноразовый номер к запросу в виде обычного текста.
@WillHartung Я нашел действительную реализацию с nonce здесь stackoverflow.com/questions/4145531/…
1. Следует ли использовать токен JWT в запросе domain2.com к sso.com? 2. И если sso.com еще не имеет файла cookie для пользователя и, таким образом, представляет страницу входа, получим ли мы 3 перенаправления (один на sso.com, один на вход в систему sso.com, один на целевую страницу domain2.com)? 3. Можем ли мы использовать другой токен JWT, на этот раз выпущенный sso.com, для отправки на domain2.com для предоставления входа в систему?
А как насчет SEO? Похоже, что каждый запрос до успешного входа в систему перенаправляется на другой домен и обратно. Я бы сказал, что это очень некрасиво. Какие заголовки нужно отправлять? 301 в систему единого входа, а затем вернуться 301 на исходную страницу? Значит, поискового бота «просят» дважды изменить индекс для этой страницы?
Перенаправление на SSO должно быть его концом - если вы не войдете в систему, вас не перенаправят обратно.
Нет смысла использовать SSL для междоменного входа, если вы не используете SSL для всего сеанса. Украсть cookie сеанса так же легко, как и использовать хэш в URL-адресе. Какой смысл скрывать хеш в SSL, если остальная часть сеанса небезопасна.
Метод, указанный вверху, в значительной степени является стандартным. Другой вопрос, будете ли вы использовать безопасные протоколы, но было бы бессмысленно шифровать только часть сеанса.
С SSL. Вы не можете играть в человека посередине, если Джек аутентифицирует сервер domain1.com и имеет конфиденциальный канал.