Facebook-чат аутентификации XMPP с Gloox?

Ну, я, вероятно, делаю что-то глупое, но я бился головой об стену этим последние несколько часов, и до сих пор я понятия не имею, что я делаю неправильно.

В данный момент я пытаюсь сделать эту работу с PLAIN SASL, потому что кажется, что Facebook активно делает OAuth2 болью для не-веб-приложений, но для меня это не имеет никакого значения, пока я могу заставить это работать как-то.

Текущий код:

_client = new Client(JID(username /* no @chat.facebook.com */), password);

_client->setServer("chat.facebook.com");
_client->setPort(5222);

_client->setSASLMechanisms(gloox::SaslMechPlain);
_client->setTls(gloox::TLSPolicy::TLSRequired);

_client->connect(false);
_client->login(); // not necessary?

QThread::sleep(10); // arbitrary sleep; should be sufficient

std::cout << _client->authed() << std::endl; // false
std::cout << _client->authError() << std::endl; // AuthErrorUndefined

_client->rosterManager()->fill();

// neither one has any effect
MessageSession(_client, JID("[email protected]")).send("balls");
MessageSession(_client, JID("friend")).send("balls");

std::cout << _client->rosterManager()->roster()->size() << std::endl; // 0

Изменить: В этом отношении я не могу заставить Gloox работать с Gmail (не пробовал другие серверы XMPP).

0

Решение

  1. Ваш JID действительно [email protected], не только username — и это очень важно для аутентификации SASL, она не будет работать с неправильным JID.
  2. Чат Facebook поддерживает аутентификацию SASL PLAIN через соединение SSL / TLS, а также DIGEST-MD5
  3. Google Talk также поддерживает SASL PLAIN поверх TLS
  4. Вы можете увидеть поддерживаемые механизмы SASL в первом <stream:features>...</stream:features> пакет с сервера
  5. Будет намного лучше, если вы покажете журналы ошибок
1

Другие решения

Ну, я все еще не уверен на 100%, в чем была проблема с Gloox, но следующий примерно эквивалентный код Swiften работает без проблем.

SimpleEventLoop* eventLoop = new SimpleEventLoop();
BoostNetworkFactories networkFactories(eventLoop);

_client = new Client
(
username.append("@chat.facebook.com").toStdString(),
password.toStdString(),
&networkFactories
);
_client->setAlwaysTrustCertificates();

_client->onConnected.connect([&] () { signInStatus = SignInStatus::Success; });
_client->onDisconnected.connect([&] (const boost::optional<ClientError>& e) {
signInStatus = SignInStatus::InvalidCredentials;
});

_client->connect();
std::thread([&] () { eventLoop->run(); }).detach();

while (signInStatus == SignInStatus::NotSignedIn)
{
QThread::sleep(1);
}

if (signInStatus == SignInStatus::InvalidCredentials)
{
return signInStatus;
}

_client->requestRoster();
QThread::sleep(5);
std::cout << _client->getRoster()->getItems()[0].getName() << std::endl;

Message::ref message(new Message());
message->setTo(_client->getRoster()->getItems()[0].getJID());
message->setFrom(JID());
message->setBody("balls");
_client->sendMessage(message);
0

По вопросам рекламы [email protected]