Facebook 使用 Gloox 聊天 XMPP 身份验证?
Posted
技术标签:
【中文标题】Facebook 使用 Gloox 聊天 XMPP 身份验证?【英文标题】:Facebook chat XMPP authentication with Gloox? 【发布时间】:2014-04-16 02:17:28 【问题描述】:好吧,我可能在做一些愚蠢的事情,但在过去的几个小时里,我一直在用这个把头撞到墙上,到目前为止,我不知道我做错了什么。
目前我正在尝试使用 PLAIN SASL 进行这项工作,因为 Facebook 似乎积极地让 OAuth2 成为非 Web 应用程序的痛苦,但只要我能让它工作,它对我来说真的没有什么区别不知何故。
当前代码:
_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("friend@chat.facebook.com")).send("balls");
MessageSession(_client, JID("friend")).send("balls");
std::cout << _client->rosterManager()->roster()->size() << std::endl; // 0
编辑:就此而言,我也无法让 Gloox 与 Gmail 一起使用(没有尝试过任何其他 XMPP 服务器)。
【问题讨论】:
【参考方案1】:-
您的 JID 确实是
username@chat.facebook.com
,而不仅仅是 username
- 这对 SASL 身份验证非常重要,错误的 JID 将不起作用。
Facebook 聊天支持基于 SSL/TLS 连接的 SASL PLAIN 身份验证,以及 DIGEST-MD5
Google talk 也支持 SASL PLAIN over TLS
您可以在来自服务器的第一个 <stream:features>...</stream:features>
数据包中看到支持的 SASL 机制
如果你的显示错误日志会更好
【讨论】:
太棒了,谢谢。我最终只是通过切换到 Swiften 来让它工作,所以看起来 Gloox 中存在错误或者我做错了什么(我猜我需要注册事件处理程序,尽管文档另有断言)。作为新答案发布的大致等效(工作)Swiften 代码。【参考方案2】:好吧,我仍然不能 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);
【讨论】:
以上是关于Facebook 使用 Gloox 聊天 XMPP 身份验证?的主要内容,如果未能解决你的问题,请参考以下文章
gloox 是不是通过 BOSH 支持 BOSH 和 XMPP?
如何使用 XMPP 和 BOSH 实现 Facebook 聊天
无法将 Gloox Xmpp 客户端连接到 Openfire 服务器
Facebook 聊天使用 xmpp 问题-NoSuchAlgorithmException: KeyStore jks implementation not found