Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh mengesahkan terhadap perkhidmatan web yang dilindungi kata laluan menggunakan WS-Security dalam PHP?

Bagaimanakah saya boleh mengesahkan terhadap perkhidmatan web yang dilindungi kata laluan menggunakan WS-Security dalam PHP?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-06 14:06:02909semak imbas

How can I authenticate against password-protected web services using WS-Security in PHP?

Menyambung kepada Perkhidmatan Web yang Dilindungi Kata Laluan dengan WS-Security dalam PHP

Mengesah terhadap perkhidmatan web yang dilindungi kata laluan boleh menjadi satu cabaran, terutamanya apabila menggunakan HTTPS. Dalam senario sedemikian, skrip PHP boleh memulakan permintaan lebih awal, yang membawa kepada ralat. Untuk menyelesaikan isu ini, kami boleh melanjutkan kelas SoapHeader untuk mencipta pengesahan yang serasi dengan WS-Security.

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

Dengan kelas lanjutan ini, kami boleh menyediakan pengesahan:

$wsse_header = new WsseAuthHeader($username, $password);
$x = new SoapClient('{...}', array("trace" => 1, "exception" => 0));
$x->__setSoapHeaders(array($wsse_header));

Menggunakan WS-Security dengan Nonce dan Cap Masa

Jika anda memerlukan nonce dan cap masa untuk keselamatan yang dipertingkatkan:

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

Ingat untuk melaraskan 'Nama Pengguna', 'Kata Laluan ', dan nilai 'Endpoint' untuk memadankan kelayakan dan URL perkhidmatan web anda. Dengan kaedah pengesahan yang dipertingkatkan ini, anda boleh menyambung ke perkhidmatan web yang dilindungi kata laluan dengan selamat daripada PHP.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengesahkan terhadap perkhidmatan web yang dilindungi kata laluan menggunakan WS-Security dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn