使用Gloox进行Facebook聊天XMPP验证
Facebook chat XMPP authentication with Gloox?
嗯,我可能在做一些愚蠢的事情,但在过去的几个小时里,我一直在用这个方法捶胸顿足,到目前为止,我不知道自己做错了什么。
目前,我正试图用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服务器)。
- 您的JID实际上是
username@chat.facebook.com
,而不仅仅是username
,这对SASL身份验证非常重要,它不会使用错误的JID - Facebook聊天支持基于SSL/TLS连接的SASL PLAIN身份验证,以及DIGEST-MD5
- Google talk也支持TLS上的SASL PLAIN
- 您可以在来自服务器的第一个
<stream:features>...</stream:features>
数据包中看到支持的SASL机制 - 如果您的节目错误日志会更好
嗯,我仍然不能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);
相关文章:
- 正在尝试了解输入验证循环
- 如何在C++中检查2D数组中负值的输入验证
- LibGit2 SSH身份验证失败
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- constexpr上下文中std::initializer_list的验证
- 正在验证c++中用户的整数输入
- 加密++验证大文件签名
- C++卡验证问题
- 验证指针链
- 此代码验证公式是什么意思?
- cin 的十进制输入验证?
- 简单的 HTML 验证器
- 密码长度验证 (c++)
- 输入验证以筛选出字符、字符串和一系列整数
- 如何使用 CredUIPromptForWindowsCredentials验证凭据
- 指针验证的最佳实践?
- RSA_PKCS1签名验证
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- xmpp向face book聊天api进行身份验证,并且总是收到失败消息
- 使用Gloox进行Facebook聊天XMPP验证