2012-02-26 4 views
1

У меня есть существующее приложение Django (D), с которым я хотел бы подключиться к PHP-приложению (P на другом сервере) для аутентификации. То есть пользователи регистрируются в D, который вызывает службу на P для проверки своего пароля. Им также потребуется получить локальную учетную запись пользователя, сохраняя в них свойства в D. Фактические требования к безопасности очень низки. Для D очень сложно напрямую обращаться к базе данных P.Внедрить API проверки подлинности в PHP

Никогда не реализовав никакой аутентификации, я имел в виду что-то вроде этого:

  1. D: Сбор имя пользователя и пароль, вычислите хэш (используя тот же алгоритм, что и P)
  2. D: Вызов веб-службы (HTTP) на P, передавая имя пользователя и хэш
  3. P: Посмотрите имя пользователя, если оно не существует.
  4. P: Если это так, проверьте сохраненный хэш против прошедшего хэша, если он отличается от другого.
  5. P: Если нормально, вернуть некоторую другую информацию о пользователе (например, полное имя, некоторые предметно-конкретные вещи), в противном случае несрабатывания возвратного
  6. D: Если нормально, создавать/обновлять запись пользователя
  7. D: Если нормально, то зарегистрировать их в

Итак, несколько вопросов:.

  • Является ли такой подход разумным? Какие атаки он уязвим (информировать клиента ...)?
  • Что вы называете функциональностью, добавляемой в P: поставщик аутентификации?
  • Есть ли более стандартный способ делать это, используя стандартные протоколы или, по крайней мере, имена вызовов веб-сервисов?
  • Является ли шаг 6 разумным подходом? Есть ли недостаток в синхронизации баз данных пользователей таким образом?
+0

Является ли сервер, на котором установлено приложение Django, в той же локальной сети, что и приложение PHP, или вы проверяете подлинность через Интернет? –

+0

Такая же локальная сеть (в том же учреждении, во всяком случае). –

ответ

0

Поскольку вы упомянули, что оба сервера находятся в одном учреждении/сети, аутентификация может работать при условии использования HTTPS вместо простого HTTP.

D: Collect username and password, compute hash (using same algorithm as P) 

Если вы не можете определить, что PHP хэши такие же, как хэши ваш Django, я рекомендую вам отправить пароль более (но не более чем обычный HTTP, смотрите пункт 2).

Call web service (HTTP) on P, passing username and hash 

Вы должны использовать простой HTTP, только если вы абсолютно уверены, что оба сервера напрямую подключены. В противном случае вы восприимчивы к типичным атакам в Интернете (например, Man-in-the-middle), где вы передаете (хешированный) пароль в ясном виде. Я предполагаю, что на стороне приложения PHP вы прямо проверяете, что хеш тот же. Если вы не уверены в сетевых условиях, убедитесь, что вы вызываете веб-службу через HTTPS.

P: Look up username, fail if it doesn't exist. 
P: If it does, check stored hash against passed hash, fail if different. 
P: If ok, return some other information about the user (eg, full name, some domain-specific stuff), otherwise return fail 
D: If ok, create/update the user record 
D: If ok, then log them in. 

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

Есть два способа решения этой проблемы:

  1. опроса каждые X минут/часов, чтобы убедиться в том, что статус пользователя одинаковы
  2. Использование системы обмена сообщениями, так что каждое изменение (например, RabbitMQ.) на стороне PHP будут опубликованы и получены на стороне Django.

Первый способ более простой, но не столь эффективный и безопасный, поскольку пользователь может войти в систему на стороне Django перед следующим опросом. Это рекомендуется, если безопасность не является жизненно важной и что существует лишь небольшое количество пользователей.

Второй способ лучше, но вам нужно будет написать больше кода для управления синхронизацией (PHP и Django). Этот способ намного лучше, так как вы можете отслеживать изменения пользователя в приложении PHP почти сразу и отражать его в своей собственной базе данных, вы можете игнорировать изменения для пользователей на стороне PHP, если пользователь не использует ваше приложение Django (следовательно, нет записи на вашей стороне).

Смежные вопросы