Heim  >  Artikel  >  Backend-Entwicklung  >  Wie authentifiziert man sich in PHP bei einem WS-Security-geschützten Webdienst?

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

Susan Sarandon
Susan SarandonOriginal
2024-11-07 09:01:02843Durchsuche

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);
    }
}

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!

Stellungnahme:
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