Herstellen einer Verbindung zu einem WS-Security-geschützten Webdienst in PHP
PHP bietet integrierte Klassen für die Interaktion mit Webdiensten. Diese Klassen erfordern jedoch möglicherweise Änderungen für mit WS-Security gesicherte Dienste. Insbesondere funktioniert die Authentifizierung aufgrund fehlender Anmeldeinformationen möglicherweise nicht wie erwartet.
Um dieses Problem zu beheben, sollten Sie die SoapHeader-Klasse erweitern, um einen WS-Security-kompatiblen Authentifizierungsheader zu erstellen. Der folgende Codeausschnitt veranschaulicht diesen Ansatz:
class WsseAuthHeader extends SoapHeader { private $wss_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'; function __construct($user, $pass, $ns = null) { if ($ns) { $this->wss_ns = $ns; } $auth = new stdClass(); $auth->Username = new SoapVar($user, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wss_ns); $auth->Password = new SoapVar($pass, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wss_ns); $username_token = new stdClass(); $username_token->UsernameToken = new SoapVar($auth, SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'UsernameToken', $this->wss_ns); $security_sv = new SoapVar( new SoapVar($username_token, SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'UsernameToken', $this->wss_ns), SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'Security', $this->wss_ns); parent::__construct($this->wss_ns, 'Security', $security_sv, true); } }
Durch die Erstellung eines WS-Security-kompatiblen Headers können Sie sich beim Webdienst authentifizieren, bevor Sie eine Anfrage stellen. Um den Header zu verwenden, fügen Sie den folgenden Code ein:
$wsse_header = new WsseAuthHeader($username, $password); $x = new SoapClient('{...}', array("trace" => 1, "exception" => 0)); $x->__setSoapHeaders(array($wsse_header));
Denken Sie daran, $username und $password durch entsprechende Werte zu ersetzen.
Alternativ, wenn Sie einen Header mit einer Nonce und einem Zeitstempel benötigen, Ziehen Sie die folgende aktualisierte Version in Betracht:
class WsseAuthHeader extends SoapHeader { private $wss_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'; private $wsu_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'; function __construct($user, $pass) { $created = gmdate('Y-m-d\TH:i:s\Z'); $nonce = mt_rand(); $passdigest = base64_encode(pack('H*', sha1(pack('H*', $nonce) . pack('a*', $created) . pack('a*', $pass)))); $auth = new stdClass(); $auth->Username = new SoapVar($user, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wss_ns); $auth->Password = new SoapVar($pass, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wss_ns); $auth->Nonce = new SoapVar($passdigest, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wss_ns); $auth->Created = new SoapVar($created, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wsu_ns); $username_token = new stdClass(); $username_token->UsernameToken = new SoapVar($auth, SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'UsernameToken', $this->wss_ns); $security_sv = new SoapVar( new SoapVar($username_token, SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'UsernameToken', $this->wss_ns), SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'Security', $this->wss_ns); parent::__construct($this->wss_ns, 'Security', $security_sv, true); } }
Durch die Implementierung dieser Lösungen können Sie effektiv eine Verbindung zu einem WS-Security-geschützten Webdienst in PHP herstellen und sich korrekt authentifizieren.
Das obige ist der detaillierte Inhalt vonWie authentifiziert man sich in PHP bei einem WS-Security-geschützten Webdienst?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!