2014-05-14 5 views
1

SOAP 및 WSDL을 기반으로하는 외부 API에 권한을 부여하려고합니다. 이 기술에는 많은 경험이 없으며 API 문서는 PHP를 기반으로합니다. 파이썬에서 권한을 부여 할 수 없습니다 (SUDS를 사용하려고했습니다). 다음은 (작업중 인) PHP 코드입니다 :Python SOAP 클라이언트, 인증

class HRDConfig { 
    public $uid = "__partner_uid__"; 
    public $pass = "__encoded_cspNr_and_pass__"; // ie. "csp123pass" 

    const NS = "https://www.hrd.pl/partnerAPI/"; 
    const PARTNER = "https://www.hrd.pl/partnerAPI/Partner.php?wsdl"; 
    const DOMAIN = "https://www.hrd.pl/partnerAPI/Domain.php?wsdl"; 
    const CERTIFICATE = "https://www.hrd.pl/partnerAPI/Certificate.php?wsdl"; 
    const CLIENT = "https://www.hrd.pl/partnerAPI/Client.php?wsdl"; 
    const POLL = "https://www.hrd.pl/partnerAPI/Poll.php?wsdl"; 
    const INVOICE = "https://www.hrd.pl/partnerAPI/Invoice.php?wsdl"; 
} 

ini_set("soap.wsdl_cache_enabled", "1"); //enable cache 
$soap = new SoapClient(HRDConfig::DOMAIN, array("encoding"=>"UTF-8", "exceptions" => true)); 
$soap->__setSoapHeaders(array(new SoapHeader(HRDConfig::NS, "AuthHeader", new HRDConfig()))); 

나는이 코드를 파이썬으로 옮기려고하는데, 성공하지 못했습니다. AuthHeader를 SOAP 요청에 추가하려면 어떻게해야합니까 (lib, 아마도 SUDS 또는 SOAPpy를 사용하여)? 어떤 방법으로 권한을 부여 할 수 있습니까?

답변

1

suds으로 시작해야합니다. 실제로 해당 서비스의 자격 증명 부족으로 인해 작동하는지 확인할 수는 없지만 시작해야합니다.

[info, domainInSystem, check, changeDns, changePrivacy, createHost, transfer, register, trade, validateAuthInfo, renew, validateTradePw, transferDelete, listByClient, tradeStatus, privacyAddDomain, listAll, privacyRemoveDomain] 
{"status":false,"errorCode":"1032","error":"Auth Error"} 
{"status":false,"errorCode":"1032","error":"Auth Error"} 
None 
{"status":false,"errorCode":"1032","error":"Auth Error"} 

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:ns3="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns0="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="https://www.hrd.pl/partnerAPI/" xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Header> 
     <AuthHeader> 
     <uid>__partner_uid__</uid> 
     <pass>__encoded_cspNr_and_pass__</pass> 
     </AuthHeader> 
    </SOAP-ENV:Header> 
    <ns2:Body> 
     <ns1:check> 
     <domains xsi:type="ns3:string">lala.com</domains> 
     </ns1:check> 
    </ns2:Body> 
</SOAP-ENV:Envelope> 

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
     <ns1:checkResponse> 
     <return xsi:type="xsd:string">{&quot;status&quot;:false,&quot;errorCode&quot;:&quot;1032&quot;,&quot;error&quot;:&quot;Auth Error&quot;}</return> 
     </ns1:checkResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
: 그냥 .service.<methodname>(<args...>)

import suds.client 
from suds.sax.element import Element 
from suds.sax.attribute import Attribute 

class HRDPartnerAPI(object): 

    NS = "https://www.hrd.pl/partnerAPI/" 
    PARTNER = "http://www.hrd.pl/partnerAPI/Partner.php?wsdl" 
    DOMAIN = "https://www.hrd.pl/partnerAPI/Domain.php?wsdl" 
    CERTIFICATE = "https://www.hrd.pl/partnerAPI/Certificate.php?wsdl" 
    CLIENT = "https://www.hrd.pl/partnerAPI/Client.php?wsdl" 
    POLL = "https://www.hrd.pl/partnerAPI/Poll.php?wsdl" 
    INVOICE = "https://www.hrd.pl/partnerAPI/Invoice.php?wsdl" 

    def __init__(self, wsdl): 
     self.client = suds.client.Client(wsdl) 
     self.service = self.client.service 

    def add_authheader(self, username, password): 
     auth = Element('AuthHeader'); 
     login = Element('uid').setText(username) 
     secret = Element('pass').setText(password) 
     auth.append(login); 
     auth.append(secret); 
     self.client.set_options(soapheaders=[auth]) 

    def list_methods(self): 
     return [method for method in self.client.wsdl.services[0].ports[0].methods] 

domain = HRDPartnerAPI(wsdl=HRDPartnerAPI.DOMAIN) 
print domain.list_methods() # unauth 
print domain.service.check("lala.com") # unauth 
print domain.service.validateAuthInfo("hrd.pl","abcd") # unauth 
print domain.add_authheader("__partner_uid__", "__encoded_cspNr_and_pass__") # add auth info 
print domain.service.check("lala.com") # authenticated 
print domain.client.last_sent() # DEBUG: show last sent msg, shows AuthHeader is present. 
print domain.client.last_received() # DEBUG: show last recv. msg 

출력 어떤 방법을 당신의 AuthHeader을 추가하고 전화를 add_authheader 전화, HRDPartnerAPI 인스턴스를 생성