2015-05-21 44 views
7

Próbuję przenieść moją aplikację z aSmack na Smack 4.1.1. Mam jednak problem z używaniem tego samego serwera i danych logowania w przypadku Smack, podczas gdy na aSmack działa znakomicie.SASLError using PLAIN: not-authorized

Oto mój stary kod logowania w aSmack -

void startConnect(boolean sslFlag) throws XMPPException, SmackException, IOException { 
     ConnectionConfiguration connectionConfig = 
       new ConnectionConfiguration(HOST, Integer.parseInt(PORT), SERVICE); 
     connectionConfig.setDebuggerEnabled(true); 
     connectionConfig.setCompressionEnabled(false); 

     if (sslFlag) 
      SASLAuthentication.supportSASLMechanism("PLAIN", 0); 

     XMPPConnection connection = new XMPPTCPConnection(connectionConfig); 

      connection.connect(); 
      connection.login(mUserName, mUserPassword, getResource()); 

      // Set status to online/available 
      Presence presence = new Presence(Presence.Type.available); 
      connection.sendPacket(presence); 
      setConnection(connection); 
    } 

próbuję użyć kodu w podobny sposób w Smack zbyt -

public void init() { 
     SmackConfiguration.DEBUG = true; 
     XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder() 
       .setHost(SERVICE_NAME) 
       .setPort(5222) 
       .setServiceName(SERVICE_NAME) 
       .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) 
       .setDebuggerEnabled(true) 
       .build(); 
     mConnection = new XMPPTCPConnection(config); 

//I have tried with blacklisting and unblacklisting all three mechanism. 
     //SASLMechanism mechanism = new SASLPlainMechanism(); //This didn't help 
     //SASLAuthentication.registerSASLMechanism(mechanism); 
     SASLAuthentication.blacklistSASLMechanism("SCRAM-SHA-1"); 
     SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5"); 
     SASLAuthentication.unBlacklistSASLMechanism("PLAIN"); 
     try { 
      mConnection.connect(); 
      return; 
     } catch (SmackException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (XMPPException e) { 
      e.printStackTrace(); 
     } 
     mConnection = null; 
    } 

    public void login(String username, String password) throws IOException, XMPPException, SmackException { 

     if(mConnection==null || !mConnection.isConnected()){ 
      init(); 
      if(mConnection==null){ 
       throw new IOException(); 
      } 
     } 
     mConnection.login(username/*+"@"+SERVICE_NAME*/, password); //I have tried both the method by adding @Domain part and without it. 

     mChatManager = ChatManager.getInstanceFor(mConnection); 
     mChatManager.addChatListener(this); 
    } 

Oto wyjątek Dostaję -

05-21 21:22:29.782 19536-23179/test W/System.err﹕ org.jivesoftware.smack.sasl.SASLErrorException: SASLError using PLAIN: not-authorized 
05-21 21:22:29.782 19536-23179/test W/System.err﹕ at org.jivesoftware.smack.SASLAuthentication.authenticationFailed(SASLAuthentication.java:365) 
05-21 21:22:29.792 19536-23179/test W/System.err﹕ at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1033) 
05-21 21:22:29.792 19536-23179/test W/System.err﹕ at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$200(XMPPTCPConnection.java:937) 
05-21 21:22:29.792 19536-23179/test W/System.err﹕ at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:952) 
05-21 21:22:29.792 19536-23179/test W/System.err﹕ at java.lang.Thread.run(Thread.java:856) 

Ten wyjątek jest taki sam w przypadku SCRAM i DIGEST-MD 5 też. Po prostu zmienia nazwę.

Oto co otrzymuję z serwera -

05-21 21:22:29.512 19536-23189/test D/SMACK﹕ SENT (0): <stream:stream xmlns='jabber:client' to='xmpp.example.com' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xml:lang='en'> 
05-21 21:22:29.642 19536-23190/test D/SMACK﹕ RECV (0): <?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='214326363' from='xmpp.example.com' version='1.0' xml:lang='en'><stream:features><compression xmlns='http://jabber.org/features/compress'><method>zlib</method></compression><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>SCRAM-SHA-1</mechanism><mechanism>PLAIN</mechanism><mechanism>DIGEST-MD5</mechanism></mechanisms><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.process-one.net/en/ejabberd/' ver='hX7OB6oTZugjNIFHZvd95k5UYzc='/><register xmlns='http://jabber.org/features/iq-register'/></stream:features> 
05-21 21:22:29.652 19536-23189/test D/SMACK﹕ SENT (0): <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>ADEwMDAAMTAwMA==</auth> 
05-21 21:22:29.782 19536-23190/test D/SMACK﹕ RECV (0): <failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><not-authorized/></failure> 

Co może być problemem tutaj? Próbowałem z wszystkimi trzema mechanizmami: PLAIN, DIGEST-MD5 i domyślnym SCRAM-SHA-1. Próbowałem również z lub bez dodawania nazwy domeny na nim. Próbowałem już z dodaniem nazwy użytkownika i hasła w konfiguracji i dodając go bezpośrednio na metodę logowania.

Próbowałem z wymaganym trybie bezpieczeństwa zbyt co daje następujący błąd -

05-21 21:27:53.658 25643-26009/test D/SMACK﹕ SENT (0): <stream:stream xmlns='jabber:client' to='xmpp.example.com' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' xml:lang='en'> 
05-21 21:27:53.788 25643-26010/test D/SMACK﹕ RECV (0): <?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='4179863647' from='xmpp.example.com' version='1.0' xml:lang='en'><stream:features><compression xmlns='http://jabber.org/features/compress'><method>zlib</method></compression><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>SCRAM-SHA-1</mechanism><mechanism>PLAIN</mechanism><mechanism>DIGEST-MD5</mechanism></mechanisms><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.process-one.net/en/ejabberd/' ver='hX7OB6oTZugjNIFHZvd95k5UYzc='/><register xmlns='http://jabber.org/features/iq-register'/></stream:features> 
05-21 21:27:54.229 25643-26009/test D/SMACK﹕ SENT (0): <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>ADEwMDAAMTAwMA==</auth> 
05-21 21:27:59.264 25643-25970/test W/System.err﹕ org.jivesoftware.smack.SmackException$NoResponseException: No response received within reply timeout. Timeout was 5000ms (~5s). Used filter: No filter used or filter was 'null'. 
05-21 21:27:59.454 25643-26010/test W/AbstractXMPPConnection﹕ Connection closed with error 
    org.jivesoftware.smack.SmackException$SecurityRequiredByClientException: SSL/TLS required by client but not supported by server 
      at org.jivesoftware.smack.tcp.XMPPTCPConnection.afterFeaturesReceived(XMPPTCPConnection.java:898) 
      at org.jivesoftware.smack.AbstractXMPPConnection.parseFeatures(AbstractXMPPConnection.java:1367) 
      at org.jivesoftware.smack.tcp.XMPPTCPConnection.access$800(XMPPTCPConnection.java:139) 
      at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:998) 
      at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$200(XMPPTCPConnection.java:937) 
      at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:952) 
      at java.lang.Thread.run(Thread.java:856) 
05-21 21:27:59.494 25643-25970/test W/System.err﹕ at org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:250) 
05-21 21:27:59.494 25643-25970/test W/System.err﹕ at org.jivesoftware.smack.tcp.XMPPTCPConnection.loginNonAnonymously(XMPPTCPConnection.java:365) 
05-21 21:27:59.524 25643-25970/test W/System.err﹕ at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java:452) 
05-21 21:27:59.544 25643-25970/test W/System.err﹕ at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java:427) 
05-21 21:27:59.574 25643-25970/test W/System.err﹕ at test.Managers.XMPPManager.login(XMPPManager.java:84) 
05-21 21:27:59.594 25643-25970/test W/System.err﹕ at test.API.LoginAPI.callAPI(LoginAPI.java:31) 
05-21 21:27:59.604 25643-25970/test W/System.err﹕ at test.API.BaseAPI$XMPPTask.doInBackground(BaseAPI.java:70) 
05-21 21:27:59.624 25643-25647/test D/dalvikvm﹕ GC_CONCURRENT freed 1558K, 17% free 30564K/36743K, paused 13ms+32ms, total 111ms 
05-21 21:27:59.624 25643-25970/test W/System.err﹕ at test.API.BaseAPI$XMPPTask.doInBackground(BaseAPI.java:45) 
05-21 21:27:59.624 25643-25970/test W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:287) 
05-21 21:27:59.624 25643-25970/test W/System.err﹕ at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
05-21 21:27:59.664 25643-25970/test W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
05-21 21:27:59.664 25643-25970/test W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
05-21 21:27:59.664 25643-25970/test W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
05-21 21:27:59.664 25643-25970/test W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
05-21 21:27:59.664 25643-25970/test W/System.err﹕ at java.lang.Thread.run(Thread.java:856) 

PS:
muszę rozwiązanie w Smack 4.1.1. Mój kod działa już dobrze w Macu, potrzebuję go do ulepszenia w Smack. Sądzę, że teraz jest jasne.

Odpowiedz

2

Ok, to było raczej głupia pomyłka. Obecny kod jest idealnie w porządku. Przypadkowo umieszczam nazwę użytkownika zamiast hasła. Dowiedziałem się o błędzie, gdy próbowałem wrócić do ataku.

0

myślę następujących nieruchomości będzie pracować dla Ciebie, używam 3.1

config.setVerifyChainEnabled(false); 
config.setReconnectionAllowed(true); 
config.setSASLAuthenticationEnabled(false); 
config.setSecurityMode(SecurityMode.disabled); 
config.setDebuggerEnabled(false); 
+1

To naprawdę nie jest prawidłowa odpowiedź. XMPPTCPConnectionConfiguration nie ma wszystkich tych metod. Chyba odpowiadasz z perspektywy aSmack. Moje pytanie dotyczy programu Smack 4.1.1 – noob

+0

Używam wersji 3.1, dlatego uważam, że uważam, –

+0

Oh! Masz pojęcie, co można zrobić dla wersji 4.1.1? – noob

17

Wystąpił ten sam błąd.

Po podłączeniu do serwera XMPP byłem nazywając

mConnection.login("[email protected]", "test"); 

i to nie działa.
Aby rozwiązać problem, wprowadziłem następujące zmiany w moim kodzie.

SASLAuthentication.unBlacklistSASLMechanism("PLAIN"); 
SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5"); 
mConnection.login("test", "[email protected]"); 

Dodałem dwie linie, które Blacklist DIGEST-MD5 i umożliwią ZWYKŁY SASLMechanism a także usunąć adres IP z nazwą użytkownika.

Dla twojego odniesienia tutaj jest mój kompletny działający kod.

package com.ilink.xmpptest; 

import java.io.IOException; 
import org.jivesoftware.smack.AbstractXMPPConnection; 
import org.jivesoftware.smack.ConnectionConfiguration; 
import org.jivesoftware.smack.ConnectionListener; 
import org.jivesoftware.smack.SASLAuthentication; 
import org.jivesoftware.smack.SmackException; 
import org.jivesoftware.smack.XMPPConnection; 
import org.jivesoftware.smack.XMPPException; 
import org.jivesoftware.smack.tcp.XMPPTCPConnection; 
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 

public class MainActivity extends ActionBarActivity implements ConnectionListener { 
    private static final String TAG = MainActivity.class.getSimpleName(); 

    private AbstractXMPPConnection mConnection; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     new ConnectToXmppServer().execute(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void authenticated(XMPPConnection arg0, boolean arg1) { 
     Log.i(TAG, "Authenticated"); 
    } 

    @Override 
    public void connected(XMPPConnection arg0) { 
     Log.i(TAG, "Connected"); 
     try { 
      SASLAuthentication.unBlacklistSASLMechanism("PLAIN"); 
      SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5"); 
      mConnection.login("test", "[email protected]"); 
     } catch (XMPPException | SmackException | IOException e) { 
      e.printStackTrace(); 
      Log.e(TAG, e.getMessage()); 
     } 
    } 

    @Override 
    public void connectionClosed() { 
     Log.i(TAG, "Connection closed"); 
    } 

    @Override 
    public void connectionClosedOnError(Exception arg0) { 
     Log.i(TAG, "Connection closed on error"); 
    } 

    @Override 
    public void reconnectingIn(int arg0) { 
     Log.i(TAG, "Reconnecting in"); 
    } 

    @Override 
    public void reconnectionFailed(Exception arg0) { 
     Log.i(TAG, "Reconnection failed"); 
    } 

    @Override 
    public void reconnectionSuccessful() { 
     Log.i(TAG, "Reconnection successful"); 
    } 

    private class ConnectToXmppServer extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      Log.i(TAG, "Connecting to xmpp server started..."); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration 
         .builder() 
         .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) 
         .setServiceName("192.168.0.166") 
         .setHost("192.168.0.166") 
         .setPort(5222) 
         .setCompressionEnabled(false).build(); 
       mConnection = new XMPPTCPConnection(config); 
       mConnection.setPacketReplyTimeout(1000); 
       mConnection.addConnectionListener(MainActivity.this); 
       mConnection.connect(); 
      } catch (XMPPException | SmackException | IOException e) { 
       e.printStackTrace(); 
       Log.e(TAG, e.getMessage()); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      Log.i(TAG, "Connecting to xmpp server finished..."); 
     } 
    } 
} 
+4

Wielkie dzięki! Brak dokumentacji na ten temat jest po prostu okropny, szukałem informacji o tym przez 2 dni bez większego sukcesu ... Twój wpis jest zdecydowanie najbardziej przydatny, jaki widziałem. – Fingolfin

4

Dla polityki autoryzacji,

PLAIN Auth - Unblacklist PLAIN, Blacklist SHA-1 i MD5

MD5 Auth - Unblacklist MD5 Blacklist SHA-1 i gładkie

SCRAM-SHA -1 Auth - Unblacklist SCRAM-SHA-1 & PLAIN, Czarna lista MD5

SASLAuthentication.unBlacklistSASLMechanism("AuthName"); 
SASLAuthentication.blacklistSASLMechanism("AuthName"); 

AuthNames: PLAIN, SCRAM-SHA-1, MD5

** Sprawdź na stronie serwera, co pozwoliło metoda uwierzytelniania