【问题标题】:Facebook chat PLAIN authentication issue Windows PhoneFacebook 聊天 PLAIN 身份验证问题 Windows Phone
【发布时间】: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


    【解决方案1】:

    我不得不这样做(做/同时)。但我建议你使用图书馆。这是我试图将 php 示例转换为 C# 的情况。 http://pastebin.com/jst7qkrh 这是关于 SO 的主题:Send message via Facebook Chat API (XMPP) C#

    public string SendWihSsl(string dataToSend)
    {
        Byte[] data = System.Text.Encoding.UTF8.GetBytes(dataToSend);
    
        ssl.Write(data, 0, data.Length);
        ssl.Flush();
        data = new Byte[2048];
    
        int myBytesRead = 0;
        StringBuilder myResponseAsSB = new StringBuilder();
        do
        {
            myBytesRead = ssl.Read(data, 0, data.Length);
            myResponseAsSB.Append(System.Text.Encoding.UTF8.GetString(data, 0, myBytesRead));
            if (myResponseAsSB.ToString().IndexOf("</") != -1)
            {
                break;
            }
        } while (myBytesRead != 0);
    
        return myResponseAsSB.ToString();
    }
    

    【讨论】:

    • 谢谢大佬,本以为可以尝试循环下载数据,但没试过,觉得很奇怪。现在可以了,谢谢!
    • 顺便问一下,你知道有什么免费的 Xmpp SDK 吗?我还没有找到。
    • @quirell 不,我们有一个商业项目,所以我们不得不选择ag-software.net/matrix-xmpp-sdk
    猜你喜欢
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 2011-08-29
    • 2020-03-28
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多