Django: Есть ли безопасный и надежный способ позволить владельцам аккаунтов иметь отдельные домены в вашем приложении? - PullRequest
1 голос
/ 11 февраля 2010

Если я хочу, чтобы владельцы моей учетной записи могли иметь свои собственные субдомены и даже свои собственные домены в целом. Используя NGINX в качестве моего прокси-сервера, должен ли я создавать домены для каждого из них в моей конфигурации NGINX, и чтобы мои клиенты указывали на них свои домены, или есть причины, по которым это будет плохо? Кроме того, если я это сделаю, как я могу передать специфичную для учетной записи (учетную запись в Django DB) информацию вместе с запросом (т. Е. Запрос от www.spamfoosaccount.com на мой сервер), поэтому я передаю запрос обратно в Apache, но как знает ли мое приложение, что оно пришло из учетной записи spamfoo, если я не посмотрю на request.HTTP_HOST (это может быть лучшим способом, но я не знаю, пока не спрошу). Заранее спасибо.

1 Ответ

1 голос
/ 17 февраля 2010

Чтобы узнать, с какого домена поступает запрос, вы должны использовать request.META["HTTP_HOST"].

Однако, не полагайтесь на это значение для аутентификации, его можно легко подделать. Аутентификация должна выполняться обычным способом с django.contrib.session. Запрос от определенного домена / субдомена не должен иметь больше привилегий / прав, даже если запрос содержит аутентифицированный сеанс. Привилегии должны предоставляться пользователям / группам пользователей, а не доменам.

Обратите внимание, что сеансы браузера не могут пересекать домены второго уровня (например, файл cookie сеанса с foo.com не будет отправлен на bar.com), однако он может быть файлом cookie * .foo.com для всех поддоменов (если вы явно указали установить так).

Пусть ваши пользователи направят свои записи DNS на IP-адрес вашего сервера, пусть NGINX направит запрос на основе домена к вашему бэкэнду и проведет обычную аутентификацию в Django.

Ваш вопрос:

откуда мое приложение знает, что оно пришел из аккаунта spamfoo

Я не знаю специфики вашего приложения, но не должно иметь значения, откуда поступил запрос, но кто его выдал (например, аутентифицированный пользователь). У вас должна быть модель / поле, которое связывает ваших пользователей с соответствующими доменами. Когда пользователь связан только с одним доменом, приложение должно предполагать, что пользователь пришел из этого домена. Когда пользователь подключен к нескольким доменам, вы можете посмотреть request.META["HTTP_HOST"]. Если это значение соответствует какому-либо из доменов, с которыми связан пользователь, это нормально, значение может быть подделано, но тем не менее пользователем, связанным с этим доменом.

...