C++ 使用Gloox进行Facebook聊天XMPP身份验证?
嗯,我可能在做一些愚蠢的事情,但在过去的几个小时里,我一直在用这个把头撞在墙上,到目前为止,我不知道我做错了什么 目前,我正试图用简单的SASL来实现这一点,因为Facebook似乎积极地让OAuth2成为非Web应用程序的痛苦,但只要我能以某种方式实现它,这对我来说真的没有什么区别 当前代码:C++ 使用Gloox进行Facebook聊天XMPP身份验证?,c++,facebook,xmpp,facebook-chat,gloox,C++,Facebook,Xmpp,Facebook Chat,Gloox,嗯,我可能在做一些愚蠢的事情,但在过去的几个小时里,我一直在用这个把头撞在墙上,到目前为止,我不知道我做错了什么 目前,我正试图用简单的SASL来实现这一点,因为Facebook似乎积极地让OAuth2成为非Web应用程序的痛苦,但只要我能以某种方式实现它,这对我来说真的没有什么区别 当前代码: _client = new Client(JID(username /* no @chat.facebook.com */), password); _client->setServer("ch
_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
\u client=新客户端(JID(用户名/*no@chat.facebook.com*/),密码);
_客户端->设置服务器(“chat.facebook.com”);
_客户端->设置端口(5222);
_客户->设置资产机制(gloox::SaslMechPlain);
_客户->结算(gloox::TLSPolicy::TLSRequired);
_客户端->连接(错误);
_客户端->登录();//没有必要吗?
QThread::sleep(10);//任意睡眠;应该足够了
std::cout authed()fill();
//两者都没有任何效果
MessageSession(_客户端,JID(“friend@chat.facebook.com)发送(“球”);
MessageSession(_client,JID(“friend”))。发送(“balls”);
std::cout rosterManager()->花名册()->大小()
你的JID确实是username@chat.facebook.com
,不仅是用户名
——而且SASL身份验证非常重要,它不会与错误的JID一起工作
Facebook聊天支持通过SSL/TLS连接进行SASL普通身份验证,以及DIGEST-MD5
Google talk也支持基于TLS的SASL平原
您可以在服务器的第一个…
数据包中看到支持的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);
SimpleEventLoop*eventLoop=new SimpleEventLoop();
BoostNetworkFactories网络工厂(eventLoop);
_客户端=新客户端
(
username.append(“@chat.facebook.com”).toStdString(),
password.toStdString(),
&网络工厂
);
_客户端->setAlwaysTrustCertificates();
_client->onConnected.connect([&](){signnstatus=signnstatus::Success;});
_客户端->onDisconnected.connect([&](const boost::可选&e){
signInStatus=signInStatus::InvalidCredentials;
});
_客户端->连接();
std::thread([&](){eventLoop->run();}).detach();
while(signnstatus==signnstatus::NotSignedIn)
{
QThread::sleep(1);
}
if(SignInstallStatus==SignInstallStatus::InvalidCredentials)
{
返回信号状态;
}
_客户端->请求花名册();
QThread::sleep(5);
std::cout get花名册()->getItems()[0].getName()设置为(_client->get花名册()->getItems()[0].getJID());
message->setFrom(JID());
消息->立根体(“球”);
_客户端->发送消息(消息);
太棒了,谢谢。我只是通过切换到Swiften来实现它,所以看起来要么Gloox中有一个bug,要么我做错了什么(我猜我需要注册事件处理程序,尽管文档的断言不是这样)。作为新答案发布的大致相同(有效)的Swiften代码。