2015-05-21 3 views
7

Я пытаюсь сменить приложение с aSmack на Smack 4.1.1. Однако у меня возникли проблемы с использованием одного и того же сервера и данных для входа в случае Smack, а на aSmack он работает превосходно.SASLError using PLAIN: не авторизован

Вот мой старый код входа в 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); 
    } 

Я пытаюсь использовать код по сходному в Smack тоже -

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); 
    } 

Вот исключение я получаю -

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) 

Это исключение совпадает с SCRAM и DIGEST-MD 5 тоже. Он просто меняет имя.

Вот что я получаю от сервера -

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> 

Что может быть проблема здесь? Я пробовал со всеми тремя механизмами PLAIN, DIGEST-MD5 и по умолчанию SCRAM-SHA-1. Я также пытался с или без добавления имени домена на нем. Я попробовал его с добавлением имени пользователя и пароля в настройках и путем добавления его непосредственно в метод входа.

Я попытался с режимом требуемой безопасности тоже, что дает следующую ошибку -

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:
мне нужно решение в Смак 4.1.1. Мой код уже работает хорошо в aSmack, мне нужно его обновить в Smack. Думаю, теперь ясно.

ответ

2

Хорошо, что было довольно нелепая ошибка. Текущий код отлично подходит. Я случайно помещаю имя пользователя вместо пароля. Я узнал об ошибке, когда попытался вернуться к aSmack.

0

Я думаю, что следующее свойство будет работать для вас, я использую 3.1

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

Это не совсем правильный ответ. XMPPTCPConnectionConfiguration не имеет всех этих методов. Наверное, вы отвечаете на перспективу aSmack. Мой вопрос спрашивает о Smack 4.1.1 – noob

+0

Я использую 3.1, Вот почему я считаю, что –

+0

Oh! Любая идея, что можно сделать для 4.1.1? – noob

17

Я столкнулся с той же ошибкой.

После подключения к серверу XMPP я звонил

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

и он не работает.
Для решения этой проблемы в моем коде были внесены следующие изменения.

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

Я добавил две линии, которые в черной список DIGEST-MD5 и PLAIN позволяют SASLMechanism, а также удаленную IP-адрес от имени пользователя.

Для справки здесь приведен мой полный рабочий код.

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

Большое спасибо! Отсутствие документации по этой проблеме просто ужасно, я искал фрагменты информации об этом в течение 2 дней без особого успеха ... Ваш пост, безусловно, самый полезный, который я видел. – Fingolfin

4

Для политики авторизации,

ОБЫЧНАЯ Auth - Unblacklist ОБЫЧНАЯ, Blacklist SHA-1 и MD5

MD5 Auth - Unblacklist MD5, Blacklist SHA-1 И ОБЫЧНАЯ

SCRAM-ША -1 Авт - Unblacklist SCRAM-SHA-1 & РАВНИНА, Черный список MD5

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

AuthNames: PLAIN, SCRAM-SHA-1, MD5

** Проверьте на стороне сервера, какой метод аутентификации включен