unix c++ 应用程序服务器使用普通身份验证未从 GCM xmpp ccs 接收 <success>
unix c++ app server using plain authentication not receiving <success> from GCM xmpp ccs
我正在开发 unix C++ 通知应用程序服务器并且不使用任何 xmpp 库。
我正在尝试按照 https://developers.google.com/cloud-messaging/ccs 中的步骤进行握手。我在 ssl 隧道上使用 TLS 协议。
我将以下内容发送到 gcm.googleapis.com:5235
<stream:stream to='gcm.googleapis.com' version='1.0' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'/>
我收到了来自 gcm.googleapis.com:5235 的两条回复消息
1. <stream:stream from="gcm.googleapis.com" id="60D46BF12BAF72D3" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client">
2. <stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>X-OAUTH2</mechanism><mechanism>X-GOOGLE-TOKEN</mechanism><mechanism>PLAIN</mechanism></mechanisms></stream:features>
并且,我发送了以下消息作为回应。我尝试使用来自 gloox 的 encode64 代码。我也尝试使用 inhouse Base64::encode_8bit。以下是 TheWonderBird 评论后的修复,但尚未成功。
stringstream key;
key << '[=11=]' << senderId << "@gcm.googleapis.com" << '[=11=]' << apiKey;
string hexkey = encode64(key.str());
stringstream auth;
auth << "<auth mechanism='PLAIN' xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" << hexkey << "</auth>";
string authStr = auth.str();
sslSock_->write(authStr.c_str(), authStr.length());
我原本希望从 gcm.googleapis.com:5235 收到 <success>
,但收到的却是零字节,并从 SSL_get_error 函数调用中收到错误代码 5。我不确定我在这里做错了什么,因为我正在按照 https://developers.google.com/cloud-messaging/ccs
中的步骤操作
此外,我看不出 sender-id 有什么用,因为步骤中没有提到它可以发送到任何地方。
有人可以指导我吗?请注意,我不允许使用任何 xmpp 库,我必须在 Unix C++ 中开发它。
<auth>
中的字符串应该是 base64 编码的 [=11=]username[=11=]password
字符串,而不是您的 API 密钥。用户名是 senderId@gcm.googleapis.com
,密码是您的 API 密钥。我建议您了解更多有关 XMPP 和普通身份验证机制的信息或使用现成的库。
TheWonderBird 的评论绝对有帮助。我还需要做一项修复。我正在发送关闭 xml <stream:stream to='gcm.googleapis.com' version='1.0' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'/>
。相反,我应该发送 <stream:stream to='gcm.googleapis.com' version='1.0' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>
。基本不关流
终于收到了<success>
。
我正在开发 unix C++ 通知应用程序服务器并且不使用任何 xmpp 库。 我正在尝试按照 https://developers.google.com/cloud-messaging/ccs 中的步骤进行握手。我在 ssl 隧道上使用 TLS 协议。
我将以下内容发送到 gcm.googleapis.com:5235
<stream:stream to='gcm.googleapis.com' version='1.0' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'/>
我收到了来自 gcm.googleapis.com:5235 的两条回复消息
1. <stream:stream from="gcm.googleapis.com" id="60D46BF12BAF72D3" version="1.0" xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client">
2. <stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>X-OAUTH2</mechanism><mechanism>X-GOOGLE-TOKEN</mechanism><mechanism>PLAIN</mechanism></mechanisms></stream:features>
并且,我发送了以下消息作为回应。我尝试使用来自 gloox 的 encode64 代码。我也尝试使用 inhouse Base64::encode_8bit。以下是 TheWonderBird 评论后的修复,但尚未成功。
stringstream key;
key << '[=11=]' << senderId << "@gcm.googleapis.com" << '[=11=]' << apiKey;
string hexkey = encode64(key.str());
stringstream auth;
auth << "<auth mechanism='PLAIN' xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" << hexkey << "</auth>";
string authStr = auth.str();
sslSock_->write(authStr.c_str(), authStr.length());
我原本希望从 gcm.googleapis.com:5235 收到 <success>
,但收到的却是零字节,并从 SSL_get_error 函数调用中收到错误代码 5。我不确定我在这里做错了什么,因为我正在按照 https://developers.google.com/cloud-messaging/ccs
此外,我看不出 sender-id 有什么用,因为步骤中没有提到它可以发送到任何地方。
有人可以指导我吗?请注意,我不允许使用任何 xmpp 库,我必须在 Unix C++ 中开发它。
<auth>
中的字符串应该是 base64 编码的 [=11=]username[=11=]password
字符串,而不是您的 API 密钥。用户名是 senderId@gcm.googleapis.com
,密码是您的 API 密钥。我建议您了解更多有关 XMPP 和普通身份验证机制的信息或使用现成的库。
TheWonderBird 的评论绝对有帮助。我还需要做一项修复。我正在发送关闭 xml <stream:stream to='gcm.googleapis.com' version='1.0' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'/>
。相反,我应该发送 <stream:stream to='gcm.googleapis.com' version='1.0' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>
。基本不关流
终于收到了<success>
。