我有一个现有的Django应用程序(D),我想与PHP应用程序(P,在不同的服务器上)进行身份验证。也就是说,用户登录D,D调用P上的服务来检查他们的密码。他们还需要以本地用户帐户结束,在D中存储有关它们的属性。实际安全要求非常低。 D直接访问P的数据库非常困难。
从未实施任何身份验证,我在考虑这样的事情:
所以,有几个问题:
答案 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。否则,您很容易受到典型的网络攻击(例如,中间人),您可以清楚地传输(哈希)密码。我假设在PHP应用程序端,您直接验证散列是否相同。如果不确定网络状况,请确保通过HTTPS调用Web服务。
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端。
有两种方法可以解决这个问题:
第一种方式更简单但不那么高效和安全,因为用户仍然可以在下次轮询之前登录Django端。如果安全性不重要且只有少量用户,则建议使用此方法。
第二种方式更好,但您必须编写更多代码来管理同步(PHP和Django)。这种方式要好得多,因为您几乎可以立即跟踪PHP应用程序中的用户更改并将其反映在您自己的数据库中,如果用户没有使用您的Django应用程序,您可以忽略对PHP用户的更改(因此没有记录在你身边)。