Heim > Artikel > Backend-Entwicklung > Wie kann ich mich mit WS-Security in PHP bei passwortgeschützten Webdiensten authentifizieren?
Herstellen einer Verbindung zu passwortgeschützten Webdiensten mit WS-Sicherheit in PHP
Die Authentifizierung gegenüber passwortgeschützten Webdiensten kann insbesondere eine Herausforderung sein bei Verwendung von HTTPS. In solchen Szenarien kann es sein, dass das PHP-Skript eine Anfrage vorzeitig initiiert, was zu Fehlern führt. Um dieses Problem zu lösen, können wir die SoapHeader-Klasse erweitern, um eine mit WS-Security kompatible Authentifizierung zu erstellen.
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); } }
Mit dieser erweiterten Klasse können wir die Authentifizierung einrichten:
$wsse_header = new WsseAuthHeader($username, $password); $x = new SoapClient('{...}', array("trace" => 1, "exception" => 0)); $x->__setSoapHeaders(array($wsse_header));
WS-Sicherheit mit Nonce und Zeitstempel verwenden
Wenn Sie eine Nonce und einen Zeitstempel für erhöhte Sicherheit benötigen:
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); } }
Denken Sie daran, „Benutzername“ und „Passwort“ anzupassen ' und 'Endpoint'-Werte entsprechend Ihren Webdienst-Anmeldeinformationen und Ihrer URL. Mit diesen erweiterten Authentifizierungsmethoden können Sie sicher über PHP eine Verbindung zu passwortgeschützten Webdiensten herstellen.
Das obige ist der detaillierte Inhalt vonWie kann ich mich mit WS-Security in PHP bei passwortgeschützten Webdiensten authentifizieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!