首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Facebook chat XMPP使用Gloox进行身份验证?

Facebook chat XMPP使用Gloox进行身份验证?
EN

Stack Overflow用户
提问于 2014-04-16 10:17:28
回答 2查看 686关注 0票数 0

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

目前,我正在尝试用简单的OAuth2来实现这一点,因为Facebook似乎在积极地让非网络应用程序感到痛苦,但只要我能以某种方式让它正常工作,这对我来说真的没有什么不同。

当前代码:

代码语言:javascript
复制
_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服务器)。

EN

回答 2

Stack Overflow用户

发布于 2014-04-16 12:07:58

  1. 您的JID确实是username@chat.facebook.com,不仅是username,而且它对username身份验证非常重要,它不会与错误的JID一起工作。
  2. Facebook chat支持SSL/TLS连接上的SASL普通身份验证,以及DIGEST-MD5
  3. Google talk也支持TLS上的SASL普通
  4. 您可以在来自服务器的第一个<stream:features>...</stream:features>数据包<代码>H211<代码>H112中看到支持的SASL机制。如果您的show error日志<代码>H213<代码>G214
票数 1
EN

Stack Overflow用户

发布于 2014-04-16 14:33:51

好吧,我仍然不能100%确定Gloox的问题是什么,但是下面的大致等效的Swiften代码没有任何问题。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23097843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档