Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中实现身份验证API_Php_Django_Security_Authentication_Login - Fatal编程技术网

在PHP中实现身份验证API

在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:如果是,则根据传递的哈希检查存储的哈希,如果不同,则失

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

从未实施过任何身份验证,我想到的是:

  • D:收集用户名和密码,计算哈希(使用与P相同的算法)
  • D:在P上调用web服务(HTTP),传递用户名和散列
  • 查找用户名,如果不存在则失败
  • P:如果是,则根据传递的哈希检查存储的哈希,如果不同,则失败
  • P:如果可以,返回一些关于用户的其他信息(例如,全名,一些特定于域的信息),否则返回失败
  • D:如果确定,则创建/更新用户记录
  • D:如果可以,请登录
  • 因此,有几个问题:

    • 这种做法明智吗?它容易受到什么攻击(通知客户…)
    • 您将在P添加的功能称为什么:身份验证提供程序
    • 有没有更标准的方法来做这件事,使用标准协议,或者至少是web服务调用名
    • 第6步是否合理?以这种方式同步用户数据库是否有缺点

    由于您提到两台服务器位于同一机构/网络中,只要您使用HTTPS而不是普通HTTP,身份验证就可以工作

    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端

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

  • 每X分钟/小时轮询一次,以验证用户状态是否相同
  • 使用消息传递系统(例如RabbitMQ),这样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.