在PHP中实现身份验证API

时间:2012-02-26 22:11:33

标签: php django security authentication login

我有一个现有的Django应用程序(D),我想与PHP应用程序(P,在不同的服务器上)进行身份验证。也就是说,用户登录D,D调用P上的服务来检查他们的密码。他们还需要以本地用户帐户结束,在D中存储有关它们的属性。实际安全要求非常低。 D直接访问P的数据库非常困难。

从未实施任何身份验证,我在考虑这样的事情:

  1. D:收集用户名和密码,计算哈希值(使用与P相同的算法)
  2. D:在P上调用Web服务(HTTP),传递用户名和哈希
  3. P:查找用户名,如果不存在则失败。
  4. P:如果是,请检查存储的散列是否与传递的散列相比,如果不同则失败。
  5. P:如果没问题,请返回有关用户的其他信息(例如,全名,某些特定于域的内容),否则返回失败
  6. D:如果可以,请创建/更新用户记录
  7. D:如果没问题,请登录。
  8. 所以,有几个问题:

    • 这种做法是否明智?它容易受到哪些攻击(通知客户......)?
    • 您认为在P:身份验证提供商处添加的功能是什么?
    • 使用标准协议或至少是Web服务呼叫名称,是否有更标准的方法来执行此操作?
    • 第6步是合理的做法吗?以这种方式同步用户数据库是否存在缺点?

1 个答案:

答案 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端。

有两种方法可以解决这个问题:

  1. 每X分钟/小时轮询以验证用户状态是否相同
  2. 使用消息传递系统(例如RabbitMQ),以便在Django端发布和接收PHP端的每个更改。
  3. 第一种方式更简单但不那么高效和安全,因为用户仍然可以在下次轮询之前登录Django端。如果安全性不重要且只有少量用户,则建议使用此方法。

    第二种方式更好,但您必须编写更多代码来管理同步(PHP和Django)。这种方式要好得多,因为您几乎可以立即跟踪PHP应用程序中的用户更改并将其反映在您自己的数据库中,如果用户没有使用您的Django应用程序,您可以忽略对PHP用户的更改(因此没有记录在你身边)。