我使用这种方式从服务器端获取数据到客户端。但我有个问题验证服务器文件。
我想检查用户名和密码之前给权限读取数据。我试图用一个额外的方法,但我不工作。
服务器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);
如果您可以接受硬编码的用户名和密码以及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摘要身份验证更安全,因为它只发送凭据的哈希值,但它需要更多的工作来设置。PHP手册中的HTTP身份验证页面是一个很好的起点。
为了在服务器端验证接收到的用户名/密码数据,您可能还希望使用具有有效用户名/密码/登录令牌的数据库,而不是来自示例的硬编码凭据。
为什么不将username+pass作为soap中的参数发送呢?在服务器端,你应该有一个具有所有身份验证逻辑的基对象,并让"MyService"继承它。基本对象将始终处理请求,然后如果它通过身份验证,则将详细信息传递给MyService。