在密码保护的目录中连接到SOAP API时出现问题

时间:2011-09-15 19:04:12

标签: php magento soap iis-7.5

我正在尝试使用SOAP访问Magento API。我的代码工作正常,但客户端希望密码保护Magento主文件夹。这样做会破坏对API的访问并导致错误。

文档表明这不是问题,您只需指定用户名/密码,但这不起作用。

我正在使用PHP和IIS,通过Plesk 10设置密码保护。这是使用基本HTTP身份验证还是别的?

我的访问代码是:

$client = new SoapAuthClient($GLOBALS["magento_api_path"],array(  

                            'login'=>"admin", 
                            'password'=>"password" 
                          ) 
                    ); 
$session = $client->login($GLOBALS["magento_api_user"], $GLOABLS["magento_api_password"] ,
                    array(  

                            'login'=>"admin", 
                            'password'=>"password" 
                          ) ); 

我得到的错误是:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://www.domain.co.uk/magento/index.php/api/index/index/wsdl/1/' : failed to load external entity "http://www.domain.co.uk/magento/index.php/api/index/index/wsdl/1/" in C:\Inetpub\vhosts\domain.co.uk\httpdocs\backend\index.php:20 Stack trace: #0 C:\Inetpub\vhosts\domain.co.uk\httpdocs\backend\index.php(20): SoapClient->__call('login', Array) #1 C:\Inetpub\vhosts\domain.co.uk\httpdocs\backend\index.php(20): SoapClient->login('backenduser', 'backendwebuser', Array) #2 {main} thrown in C:\Inetpub\vhosts\domain.co.uk\httpdocs\backend\index.php on line 20

引用的行是$ client->登录命令。

有什么建议吗?

4 个答案:

答案 0 :(得分:8)

很久以前我遇到过类似的问题。

就我而言,我没有立即意识到我需要在创建.htaccess实例时使用SoapClient凭据,而是将SOAP API凭据传递给login方法。

我正在传递SOAP API凭据,并且像您一样得到类似的错误。

这对我有用(1.3.x版本。但截至今天仍适用于我):

$cProxy = new SoapClient(
    URL . 'index.php/api/soap/?wsdl',
    array(
        'login' => HTACCESS_USER,
        'password' => HTACCESS_PASS
    )
);
$rSessionId = $cProxy->login(
    SOAP_USER,
    SOAP_PASS
);

只是为了保存,你没有被错字所困:你将$GLOABLS["magento_api_password"]作为第二个参数传递给login方法,该方法应为$GLOBALS["magento_api_password"]

最后,你将第三个参数传递给我认为已经过时的login方法,因为afaik它被定义为只有两个参数:

<message name="login">
    <part name="username" type="xsd:string" />
    <part name="apiKey" type="xsd:string" />
</message>

答案 1 :(得分:4)

去过那里,做到了:P

    $client = new SoapClient("http://${http_user}:${http_pass}@subdomain.domain.com", array(
        'login' => $user,
        'password' => $pass,
    ));

问题是http auth的使用仅在请求期间发生,而不是在第一次请求时实际获取wsdl。要解决这个问题,只需使用我在上面发布的格式:http://USERNAME:PASSWORD@server.com/

干杯

答案 2 :(得分:2)

这个问题可能是因为Magento内部通过本地HTTP请求请求它自己的WSDL。由于您的密码保护了访问权限,因此无法正常工作。如果请求来自localhost,则将安全性修改为不需要密码。

答案 3 :(得分:0)

如果查看Mage_Api_Model_Server_Adapter_Soap::getWsdlUrl(),您会看到,该magento假定基本身份验证登录名和密码作为环境变量PHP_AUTH_USERPHP_AUTH_PW传递。