【问题标题】:PHP SoapClient with BasicAuth带有 BasicAuth 的 PHP SoapClient
【发布时间】:2015-08-19 14:36:00
【问题描述】:

我有一个 PHP 脚本试图连接到 WSDL。 我需要允许自签名并提供基本的身份验证详细信息。 使用 SOAP UI,当我连接到 WSDL 时,系统会提示我输入用户名/密码。 我得到了这个工作。

我还发现每个请求还需要基本身份验证(所以在请求屏幕上,我必须选择身份验证,然后选择基本身份,输入与我在提示中使用的凭据相同的凭据)。

如何在 PHP 中执行此身份验证 正如我所说,我可以连接,不是问题,如果我尝试发出请求,我似乎会终止服务或超时

<?php
$context = stream_context_create(array(
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
 ));

$data = array(
    'columnA' => 'dataA',
    'columnB' => 'dataB',
    'columnC' => 'dataC');

$url = 'https://111.111.111.111:1234/dir/file';
$login = 'username';
$pwd = 'password';


$client = new soapClient(null, array(
     'location' => $url,
     'uri' => '',
     'login' => $login,
     'password' => $pwd,
     'stream_context' => $context
));
echo "\n\r---connected---\n\r";
$result = $client ->requestName($data);

print_r($result);
?>

我的输出是 ---已连接---

然后它似乎挂起。 我已经尝试将它包裹在一个 try catch 中,并且得到了相同的结果。

有什么建议吗??

【问题讨论】:

    标签: php soap wsdl soap-client


    【解决方案1】:

    来自Manualsoapclient 支持http基本认证。

    对于 HTTP 身份验证,登录和密码选项可用于 提供凭证。通过代理建立 HTTP 连接 服务器,选项 proxy_host、proxy_port、proxy_login 和 proxy_password 也可用。对于 HTTPS 客户端证书 身份验证使用 local_cert 和密码选项。一个 身份验证可以在身份验证选项中提供。这 身份验证方法可以是 SOAP_AUTHENTICATION_BASIC (默认)或 SOAP_AUTHENTICATION_DIGEST。

    $wsdl = "http://example/services/Service?wsdl";
    $option = array(
        "trace"=>1,
        "login"=>"admin",
        "password"=>"admin",
    );
    $client = new SoapClient($wsdl,$option);
    

    但是当我启动soapclient时,它会抛出这个错误

    例外:未经授权

    我也尝试过将身份验证放在 url 中,比如

    $wsdl = "http://admin:admin@example/services/Service?wsdl";
    

    但它也不起作用。

    最后我通过在选项中添加authentication 解决了这个问题。手册上说authentication默认值是基本身份验证,但只有当我明确设置时,它才能工作。

    $option = array(
        "trace"=>1,
        "login"=>"admin",
        "password"=>"admin",
        "authentication"=>SOAP_AUTHENTICATION_BASIC
    );
    

    【讨论】:

      【解决方案2】:

      尝试在您使用的 url 中对您的用户名和密码进行 url 编码:

      $url = 'http://'.urlencode('yourLogin').':'.urlencode('yourPassword').'@111.111.111.111:1234/dir/file';
      

      另外,我没有看到您在代码示例中使用 wsdl。您始终可以在本地下载 wsdl 的副本,然后引用该本地副本。您可以随意下载 wsdl(使用 php、curl、手动)。

      【讨论】:

      • 谢谢,但我可以连接。所以在连接上解析用户名和密码不会有什么不同。它提出请求。作为第三方,我无法在本地拉取请求,我们正在发送数据。而且我无法将身份验证方法更改为第三方
      • 将它们添加到 url 时,您不是在解析它们,而是将它们包含在每个请求中。通过预先下载 wsdl,您仍然可以连接到外部 url
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多