C++ 使用Gloox进行Facebook聊天XMPP身份验证?

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

嗯,我可能在做一些愚蠢的事情,但在过去的几个小时里,我一直在用这个把头撞在墙上,到目前为止,我不知道我做错了什么

目前,我正试图用简单的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
\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代码。