>  기사  >  백엔드 개발  >  PHP에서 WS-Security를 ​​사용하여 비밀번호로 보호된 웹 서비스에 대해 어떻게 인증할 수 있나요?

PHP에서 WS-Security를 ​​사용하여 비밀번호로 보호된 웹 서비스에 대해 어떻게 인증할 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-06 14:06:02909검색

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

PHP에서 WS-Security를 ​​사용하여 비밀번호로 보호된 웹 서비스에 연결

비밀번호로 보호된 웹 서비스에 대해 인증하는 것은 특히 어려울 수 있습니다. HTTPS를 사용할 때. 이러한 시나리오에서는 PHP 스크립트가 조기에 요청을 시작하여 오류가 발생할 수 있습니다. 이 문제를 해결하려면 SoapHeader 클래스를 확장하여 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);
    }
}

이 확장 클래스를 사용하여 인증을 설정할 수 있습니다.

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

Nonce 및 타임스탬프와 함께 WS-Security 사용

보안 강화를 위해 nonce 및 타임스탬프가 필요한 경우:

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

'사용자 이름', '비밀번호' 조정을 기억하세요. ' 및 'Endpoint' 값을 웹 서비스 자격 증명 및 URL과 일치시킵니다. 이러한 향상된 인증 방법을 사용하면 PHP에서 비밀번호로 보호된 웹 서비스에 안전하게 연결할 수 있습니다.

위 내용은 PHP에서 WS-Security를 ​​사용하여 비밀번호로 보호된 웹 서비스에 대해 어떻게 인증할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.