在PHP中实现身份验证API
我有一个现有的Django应用程序(D),我想与PHP应用程序(p,在不同的服务器上)连接以进行身份验证。也就是说,用户登录到D,D调用P上的服务来检查他们的密码。他们还需要一个本地用户帐户,将他们的属性存储在D中。实际的安全要求非常低。D很难直接访问P的数据库 从未实施过任何身份验证,我想到的是:在PHP中实现身份验证API,php,django,security,authentication,login,Php,Django,Security,Authentication,Login,我有一个现有的Django应用程序(D),我想与PHP应用程序(p,在不同的服务器上)连接以进行身份验证。也就是说,用户登录到D,D调用P上的服务来检查他们的密码。他们还需要一个本地用户帐户,将他们的属性存储在D中。实际的安全要求非常低。D很难直接访问P的数据库 从未实施过任何身份验证,我想到的是: D:收集用户名和密码,计算哈希(使用与P相同的算法) D:在P上调用web服务(HTTP),传递用户名和散列 查找用户名,如果不存在则失败 P:如果是,则根据传递的哈希检查存储的哈希,如果不同,则失
- 这种做法明智吗?它容易受到什么攻击(通知客户…)李>
- 您将在P添加的功能称为什么:身份验证提供程序
- 有没有更标准的方法来做这件事,使用标准协议,或者至少是web服务调用名
- 第6步是否合理?以这种方式同步用户数据库是否有缺点
D: Collect username and password, compute hash (using same algorithm as P)
除非您能够确定PHP哈希与Django哈希相同,否则我建议您通过发送密码(但不要通过普通HTTP,请参见第2点)
只有在绝对确定这两台服务器是直接连接的情况下,才应该使用普通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端
有两种方法可以解决此问题:
第二种方法更好,但您必须编写更多代码来管理同步(PHP和Django)。这种方法更好,因为您可以几乎立即跟踪PHP应用程序中的用户更改,并将其反映到您自己的数据库中。如果用户未使用Django应用程序,您可以忽略PHP端用户的更改(因此您端没有记录).托管Django应用程序的服务器是否与PHP应用程序在同一个本地网络中,或者您是否通过internet进行身份验证?是否在同一个本地网络中(无论如何,在同一个机构中)。
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.