Wie authentifiziert man sich in PHP bei einem WS-Security-geschützten Webdienst?

Susan Sarandon
Freigeben: 2024-11-07 09:01:02
Original
838 Leute haben es durchsucht

How to authenticate to a WS-Security protected Web Service in PHP?

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);
    }
}
Nach dem Login kopieren

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));
Nach dem Login kopieren

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);
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!