如何在PHP中验证非wsdl soap

时间:2015-07-31 17:17:17

标签: php soap

我用这种方式从服务器端到客户端获取数据。但我有一个问题 验证服务器文件。

我想在获得读取数据的权限之前检查用户名和密码。 我尝试使用额外的方法,但我没有工作。

服务器

class MyService
{
    public function add($x, $y)
    {
        return $x + $y;
    }
}

$options = array(
    'uri' => 'http://server/namespace',
    'location' => 'http://server/location',
);

$server = new SOAPServer(null, $options);
$server->setObject(new MyService());
$server->handle();

客户端

$options = array(
    'uri' => 'http://server/namespace',
    'location' => 'http://server/location',
);
$client = new SOAPClient(null, $options);
echo $client->add(10, 10);

2 个答案:

答案 0 :(得分:5)

如果您可以使用硬编码的用户名和密码以及HTTP基本身份验证,那么您可以将以下代码放在服务器文件之上:

if (! isset($_SERVER['PHP_AUTH_USER']) ||
    $_SERVER['PHP_AUTH_USER'] !== 'foo' ||
    $_SERVER['PHP_AUTH_PW'] !== 'bar') { 
  header('WWW-Authenticate: Basic realm="My service"');
  header('HTTP/1.1 401 Unauthorized');
  echo 'Unauthorized';
  exit;
} 

检查是否存在HTTP身份验证数据,如果不存在,则会将HTTP 401错误发送回客户端。如果存在身份验证数据,则将根据硬编码的用户名 foo 和密码 bar 对其进行验证。

要从客户端脚本传递用户名/密码,请按如下方式调整客户端中的$options

$options = array(
  'uri' => 'http://server/namespace',
  'location' => 'http://server/location',
  'login' => 'foo',     // username
  'password' => 'bar'   // password
);
$client = new SOAPClient(null, $options);

请注意,HTTP基本身份验证是最简单的设置,但该用户名和密码将以准纯文本格式传输到服务器。因此,您至少应该为服务端点使用SSL,因此所有通信都会被加密。

HTTP摘要身份验证更安全,因为它只会发送凭据的哈希值,但需要更多工作才能设置。一个很好的起点是the HTTP authentication page in the PHP manual

为验证服务器端收到的用户名/密码数据,您可能还想使用带有效用户名/密码/登录令牌的数据库,而不是示例中的硬编码凭证。

答案 1 :(得分:1)

为什么不在soap中发送用户名+ pass作为参数。在服务器端,您应该有一个具有所有身份验证逻辑的基础对象,并且具有" MyService"继承那个。基础对象将始终处理请求,然后在通过身份验证时将详细信息传递给MyService。