У меня 2 сайта: example.com и exampletwo.com

Я хочу, чтобы когда пользователь входил в систему на example.com, он автоматически аутентифицировался также на exampletwo.com

Как я могу это сделать ? Я использую Django + Nginx на первом сайте и фреймворк Tornado + сервер Tornado на втором сайте.

Благодарность ;)

.

P.S. Если вы не знакомы с этими платформами (Django, Tornado или Nginx), я также принимаю решение для общей платформы PHP + Apache, и тогда я проведу небольшое исследование :)

0
xRobot 29 Мар 2010 в 04:11

3 ответа

Лучший ответ

Я хотел бы, чтобы код, обрабатывающий регистрацию пользователя на example.com, немедленно отправлял запрос https к exampletwo.com (который, конечно, аутентифицирует его на основе сертификатов), что означает «добавить этого пользователя с этими учетными данными». Этот подход кажется работоспособным для любых двух веб-серверов / фреймворков / языков, если они могут отправлять и получать запросы HTTPS и аутентифицировать сертификаты.

Если вы не можете аутентифицировать сертификаты, вы можете отправить сообщение «добавить этого пользователя» в зашифрованном виде (при условии, что два сайта могут использовать общий секрет для шифрования). Это может быть уязвимо для атак повторного воспроизведения, но если вы сделаете отметку времени частью сообщения «добавить этого пользователя», вы можете сильно ограничить временное окно уязвимости для атак повторного воспроизведения, вероятно, достаточно, чтобы сделать этот подход жизнеспособным.

Если вы не можете безопасно обмениваться секретами между двумя сайтами, не все потеряно: вы все равно можете использовать шифрование открытого ключа. Отправитель шифрует «добавить это сообщение пользователя» (включая, конечно, временную метку) своим собственным закрытым ключом, а затем открытым ключом получателя; получатель расшифровывает то, что он получает, своим собственным закрытым ключом, а затем открытым ключом отправителя. Немного беспорядочно и, возможно, немного медленно, но при таких сложных ограничениях удивительно, что это все еще можно сделать ;-).

1
Alex Martelli 29 Мар 2010 в 04:16

Предполагая, что оба веб-сайта могут получить доступ к единой общей базе данных, это можно сделать, используя как веб-страницы, обращающиеся к таблице, так и проверяя, вошел ли пользователь в систему или нет. Я не знаком с Djano или Tornado, но если приведенное выше решение сомнительно, вы можете открыть веб-метод (веб-службы) одного веб-сайта, а затем использовать (вызвать) веб-метод с другого. Файлы cookie - это простая задача, поскольку они зависят от сайта. Другой подход - это отслеживание пользователя через IP-адрес, но динамический IP-адрес может представлять большую проблему и может использоваться для нарушения безопасности.

0
Ranhiru Jude Cooray 29 Мар 2010 в 04:31

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

С клиентскими сертификатами можно справиться, но если эта система с двойной аутентификацией предназначена для широкой публики, она не особенно хороша. Большинство людей увидят всплывающий какой-то странный запрос («Вы хотите добавить этот сертификат?») И с воплями разбегаются по холмам.

Обходной путь - сделать так, чтобы example.com выплюнул ЧТО-ТО, что заставит пользователя загрузить что-то с exampletwo.com. Изображение, фрагмент javascript и т. Д. И поместите зашифрованный токен в запрос (<img src="http://exampletwo.com/login.php?remoteauth=ENCRYPTEDTOKEN">). Затем exampletwo может расшифровать токен и, если его содержимое в порядке, отправить изображение (или то, что вы передаете) с соответствующим набором файлов cookie.

0
Marc B 29 Мар 2010 в 05:14