문제

SASL을 사용하여 XMPP 서버로 인증하려고합니다.

/**
     * Send Authentication, SASL
     * @return Bool
     * @param $username String
     * @param $password String
     */
    function authenticate($username, $password) {
        $this->username = $username;
        $this->password = $password;

        var_dump($username, $password, $this->domain);

        $auth = base64_encode($username.'@'.$this->domain."\u0000".$username."\u0000".$password);
        $xml = '<auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">'.$auth.'</auth>';
        if ($this->write($xml)) {
            if ($xml = $this->listen(1, true)) {
                if (preg_match("/<success/i", $xml)) {
                    $this->authenticated = $this->_sendStream();
                }
            }
        }
        $this->events->trigger('authenticate', $this->authenticated);
        return $this->authenticated;
    }

그러나 XMPP 서버는 다음과 같이 응답합니다.

<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><bad-protocol/></failure>

이것은 Ejabberd 서버에 대한 것입니다. XMPP 스트림을 열면 광고합니다.

<stream:features><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>DIGEST-MD5</mechanism><mechanism>PLAIN</mechanism></mechanisms><register xmlns='http://jabber.org/features/iq-register'/></stream:features>

그래서 SASL -PLAIN이 작동해야한다는 것은 나에게 이음새가 있습니다. OpenFire 서버에서 완벽하게 작동하는 JavaScript 버전이 있습니다. (지금은 Ejabberd에서 테스트 할 수 없습니다)

sendAuthentication: function() {
        clearTimeout(XMPP.sendAuthentication_timer);
        var auth = Base64.encode(XMPP.username+'@'+XMPP.domain+'\u0000'+XMPP.username+'\u0000'+XMPP.password);
        mySocket.events.receive.observe(XMPP.receivedAuthSuccess, function() {
            mySocket.send('<auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">' + auth + '</auth>');
        });
    }

PHP 버전이 작동하지 않는 이유를 알 수 없습니다.

도움이 되었습니까?

해결책 2

문제가 무엇인지 알아 냈습니다. Ejabberd는 SASL Plain 및 Digest-MD5를 광고하지만 실제로 Digest-MD5 만 허용합니다.

다른 팁

파이썬에서 이것을 시도하십시오.

Username+"@xmpp.poppen.lab"+ chr(0) + Username + chr(0) + Password

PHP도 사용합니다 chr(0) 대신에 "\u0000"

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top