4

我正在尝试使用 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 应该可以工作。我有一个 JavaScript 版本,可以在 OpenFire 服务器上完美运行。(目前我无法在 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 版本不起作用。

4

2 回答 2

2

在 Python 中试试这个:

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

而对于 PHP 也使用chr(0)代替"\u0000"

于 2011-04-11T04:43:44.140 回答
1

弄清楚问题出在哪里。EJabberd 将宣传 SASL PLAIN 和 DIGEST-MD5,但实际上只接受 DIGEST-MD5。

于 2009-08-01T19:31:42.663 回答