2012-08-22 2 views
1

Jabber.net (C#/Mono)을 사용하여 facebook 채팅에 연결하려고합니다. 내가 사용하고있는 코드는 다음과 같습니다.SASL을 사용하여 Jabber.net (C#/Mono)을 사용하여 facebook 채팅에 연결

static ManualResetEvent done = new ManualResetEvent(false); 

    const bool VERBOSE = true; 
    const string TARGET = "[email protected]"; 

    void Start() 
    { 

     JabberClient j = new JabberClient(); 

     j.User = "my_facebook_alias"; //Later to be removed 
     j.Server = "chat.facebook.com"; 
     j.Port = 5222; 
     j.NetworkHost = "chat.facebook.com"; 
     j.AutoStartCompression = true; 
     j.KeepAlive = 30F; 
     j.AutoStartTLS = false; 
     j.AutoStartCompression = true; 
     j.PlaintextAuth = true; 
     j.Password = "my_facebook_password"; //Later to be removed 
     j.RequiresSASL = true; 
     j.LocalCertificate = null; 
     // don't do extra stuff, please. 
     j.AutoPresence = false; 
     j.AutoRoster = true; 
     j.AutoReconnect = -1; 

     j.OnInvalidCertificate += new System.Net.Security.RemoteCertificateValidationCallback(j_OnInvalidCertificate); 

     // listen for errors. Always do this! 
     j.OnError += new bedrock.ExceptionHandler(j_OnError); 

     // what to do when login completes 
     j.OnAuthenticate += new bedrock.ObjectHandler(j_OnAuthenticate); 

     // listen for XMPP wire protocol 
     if (VERBOSE) 
     { 
      j.OnReadText += new bedrock.TextHandler(j_OnReadText); 
      j.OnWriteText += new bedrock.TextHandler(j_OnWriteText); 
     } 

     // Set everything in motion 
     j.Connect(); 

     // wait until sending a message is complete 
     done.WaitOne(); 

     // logout cleanly 
     j.Close(); 
    } 

    static void j_OnWriteText(object sender, string txt) 
    { 
     if (txt == " ") return; // ignore keep-alive spaces 
     Console.WriteLine("SEND: " + txt); 
    } 

    static void j_OnReadText(object sender, string txt) 
    { 
     if (txt == " ") return; // ignore keep-alive spaces 
     Console.WriteLine("RECV: " + txt); 
    } 

    static void j_OnAuthenticate(object sender) 
    { 
     Debug.Log ("OnAuth..."); 
     // Sender is always the JabberClient. 
     JabberClient j = (JabberClient)sender; 
     j.Message(TARGET, "My test message!!!"); 

     // Finished sending. Shut down. 
     done.Set(); 
    } 

    static void j_OnError(object sender, Exception ex) 
    { 
     // There was an error! 
     Console.WriteLine("Error: " + ex.ToString()); 
     Debug.Log ("Error: "+ex.ToString()); 
     // Shut down. 
     done.Set(); 
    } 

    bool j_OnInvalidCertificate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) 
    { 
     Debug.Log("Invalid certificate "+sslPolicyErrors.ToString() +" : "+certificate.ToString(true)); 

     return true; 
    } 

나는 좋은 j_OnAuthenticate를 얻습니다. 그리고 암호를 다른 것으로 변경하면 오류가 나타나기 때문에 내 ID/암호를 사용합니다. 그러나 나는 사용자 ID/암호를 저장하지 않고 로그인 할 수 있도록 X-FACEBOOK-PLATFORM SASL 메커니즘을 사용하려고합니다.

전체 로그는 다음과 같습니다 매트릭스 XMPP에서

RECV: <?xml version="1.0"?><stream:stream id="E34678B6" from="chat.facebook.com" version="1.0" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" xml:lang="en"> 
RECV: <stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>X-FACEBOOK-PLATFORM</mechanism><mechanism>DIGEST-MD5</mechanism></mechanisms></stream:features> 
SEND: <auth mechanism="DIGEST-MD5" xmlns="urn:ietf:params:xml:ns:xmpp-sasl" /> 
RECV: <challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cmVhbG09ImNoYXQuZmFjZWJvb2suY29tIixub25jZT0iMDBENjAwQ0UyNjZBNzgyMEE5MUIzRDhGNjZDODQ1QjMiLHFvcD0iYXV0aCIsY2hhcnNldD11dGYtOCxhbGdvcml0aG09bWQ1LXNlc3M=</challenge> 
SEND: <response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">dXNlcm5hbWU9ImpvbmFzMiIscmVhbG09ImNoYXQuZmFjZWJvb2suY29tIixub25jZT0iMDBENjAwQ0UyNjZBNzgyMEE5MUIzRDhGNjZDODQ1QjMiLGNub25jZT0iMzUzMzMyM2E2YTZmNmU2MTczMzIzYTUxNGU1ZjQxNjI0YzM4NjYiLG5jPTAwMDAwMDAxLHFvcD1hdXRoLGRpZ2VzdC11cmk9InhtcHAvY2hhdC5mYWNlYm9vay5jb20iLHJlc3BvbnNlPTcxN2ExNjM0MzdjOWU5MDM2NDcwYjViNTBhOTYxODIxLGNoYXJzZXQ9dXRmLTg=</response> 
RECV: <challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cnNwYXV0aD1hM2ZlZGM1NGRmYzNmMGEzMTU5Y2EyZDVmMmVkMmE2Zg==</challenge> 
SEND: <response xmlns="urn:ietf:params:xml:ns:xmpp-sasl" /> 
RECV: <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/> 
SEND: <stream:stream xmlns:stream="http://etherx.jabber.org/streams" id="10996e3a" xmlns="jabber:client" to="chat.facebook.com" version="1.0"> 
RECV: <?xml version="1.0"?><stream:stream id="2AF2D483" from="chat.facebook.com" version="1.0" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" xml:lang="en"> 
RECV: <stream:features><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></stream:features> 
SEND: <iq id="JN_1" type="set" to="chat.facebook.com"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>Jabber.Net</resource></bind></iq> 
RECV: <iq id="JN_1" type="result"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>[email protected]/Jabber.Net_c938c6a2_4C7D6EF9DCFDC</jid></bind></iq> 
SEND: <iq id="JN_2" type="set" to="chat.facebook.com"><session xmlns="urn:ietf:params:xml:ns:xmpp-session" /></iq> 
RECV: <iq type="result" from="chat.facebook.com" id="JN_2"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq> 
OnAuth... 
SEND: <message id="JN_3" type="chat" to="[email protected]"><body>My test message!!!</body></message> 
SEND: <presence type="unavailable"><status>offline</status></presence> 
SEND: </stream:stream> 
SEND: <iq id="JN_4" type="get"><query xmlns="jabber:iq:roster" /></iq> 

는 OnBeforeSasl 위임가있는 곳에 지정 방법 할 수있는 설정 (페이스 북 앱 ID, 응용 프로그램의 비밀 액세스 토큰 등) 필요한 페이스 북 Sasl에 등록. Jabber.net에는 그런 위임자가 없습니다!

SASL 지원은 없습니까? Jabber.net은 있습니까? 아니면 어떻게 설정합니까?

+0

또한 메시지가 배달되지 않는다고 언급해야합니다. 따라서 X-FACEBOOK-PLATFORM 또는 DIGEST-MD5는 현재 작동하지 않습니다. ( – Sunkas

+0

은 웹 응용 프로그램 또는 데스크톱 응용 프로그램 용이 코드입니까? jabber-net은 데스크톱 응용 프로그램 전용이므로 –

+0

모바일 장치 용입니다. – Sunkas

답변

1

jabber-net에는 SASL이 지원되지만 X-FACEBOOK-PLATFORM SASL 메커니즘은 지원되지 않습니다. 이 메커니즘을 사용하려면이 SASL 메커니즘을 추가하여 jabber-net을 확장해야합니다.

Facebook에서 XMPP 연결을 닫습니다. 이는 인증 이벤트에서 보내는 메시지와 관련 될 수 있습니다. jabber-net이 귀하의 초기 존재를 보냈거나 귀하의 명부를 얻은 후에 귀하의 메시지를 보내보십시오.

알렉스