【发布时间】:2014-03-28 06:20:19
【问题描述】:
我正在尝试为 facebook 聊天编写简单的库,但我在一开始就遇到了一个问题。我不知道为什么 chat.facebook.com 在发送 auth 元素后会向我发送“
public const string BEGIN_AUTH_PLAIN = @"<auth xmlns='urn:ietf:params:xml:ns:xmpp- sasl' mechanism='PLAIN'>";
public const string END_AUTH = @"</auth>";
public static string GetPlainAuth(string email, string password)
{
byte[] plain = System.Text.Encoding.UTF8.GetBytes((char)0+email+(char)0+password);
string credentials = System.Convert.ToBase64String(plain);
return String.Format("{0}{1}{2}", BEGIN_AUTH_PLAIN, credentials, END_AUTH);
}
//////////////////////////////////////////////////////////////////////////////
public async Task<bool> NegotiateStream()
{
if (!connected)
return false;
writer.WriteString(XmlConstants.BEGIN_STREAM);
await writer.StoreAsync();
await reader.LoadAsync(4096);
string resp = reader.ReadString(reader.UnconsumedBufferLength);
//check if response is stream and offers plaintext mechanism
if (!resp.Contains("stream:stream") || !resp.Contains("<mechanism>PLAIN"))
return false;
writer.WriteString(XmlConstants.START_TLS);
await writer.StoreAsync();
await reader.LoadAsync(4096);
resp = reader.ReadString(reader.UnconsumedBufferLength);
if (!resp.Contains("proceed"))
return false;
//now upgrate to tls connection
await socket.UpgradeToSslAsync(SocketProtectionLevel.Ssl, HostName);
//now try to login
writer.WriteString(XmlConstants.BEGIN_STREAM);
await writer.StoreAsync();
await reader.LoadAsync(4096);
resp = reader.ReadString(reader.UnconsumedBufferLength);
if (!resp.Contains("stream:stream") || !resp.Contains("<mechanism>PLAIN"))
return false;
//now send auth
string xx = XmlConstants.GetPlainAuth(Email, Password);
writer.WriteString(xx);
await writer.StoreAsync();
await reader.LoadAsync(4096);
resp = reader.ReadString(reader.UnconsumedBufferLength);
//could not login
if (!resp.Contains("success"))
return false;
return true;
}
【问题讨论】:
标签: c# facebook windows-phone-8 xmpp