2015-05-21 15 views
7

Tôi đang cố gắng chuyển ứng dụng của mình từ aSmack sang Smack 4.1.1. Tuy nhiên tôi đang gặp rắc rối bằng cách sử dụng cùng một máy chủ và đăng nhập chi tiết trong trường hợp của Smack trong khi trên aSmack nó đang làm việc xuất sắc.SASLError sử dụng PLAIN: không được ủy quyền

Dưới đây là mã cũ của tôi đăng nhập trong 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); 
    } 

Tôi cố gắng để sử dụng mã về thời trang tương tự như trong Smack quá -

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

Đây là ngoại lệ Tôi nhận được -

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) 

Ngoại lệ này giống với SCRAM và DIGEST-MD 5 quá. Nó chỉ thay đổi tên.

Đây là những gì tôi nhận được từ máy chủ -

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> 

Điều gì có thể vấn đề ở đây? Tôi đã thử cả ba cơ chế PLAIN, DIGEST-MD5 và mặc định SCRAM-SHA-1. Tôi cũng đã cố gắng có hoặc không có thêm tên miền trên đó. Tôi đã thử nó với việc thêm tên người dùng và mật khẩu trong cấu hình và bằng cách thêm nó trực tiếp vào phương thức đăng nhập.

Tôi đã thử với chế độ bảo mật cần thiết quá mà cung cấp cho các lỗi sau -

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:
tôi cần những giải pháp trong Smack 4.1.1. Mã của tôi đã hoạt động tốt trong aSmack, tôi cần nó để nâng cấp nó trong Smack. Giờ tôi đã biết rõ rồi.

Trả lời

2

Ok, đó là thay vì một sai lầm ngớ ngẩn. Mã hiện tại hoàn toàn ổn. Tôi vô tình đặt tên người dùng thay cho mật khẩu. Tôi đã biết về lỗi khi tôi cố gắng quay lại aSmack.

0

Tôi nghĩ rằng tài sản sau đây sẽ làm việc cho bạn, tôi đang sử dụng 3,1

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

Đây không phải là thực sự là một câu trả lời đúng. XMPPTCPConnectionConfiguration không có tất cả các phương thức này. Tôi đoán bạn đang trả lời về quan điểm của aSmack. Câu hỏi của tôi là hỏi về Smack 4.1.1 – noob

+0

Tôi đang sử dụng 3.1, Đó là lý do tại sao tôi rất vui vì tôi nghĩ rằng –

+0

Oh! Bất kỳ ý tưởng những gì có thể được thực hiện cho 4.1.1? – noob

17

Tôi đang đối mặt với cùng một lỗi.

Sau khi kết nối đến máy chủ XMPP Tôi đã gọi

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

và nó đã không làm việc.
Để giải quyết vấn đề tôi đã thực hiện các thay đổi sau trong mã của tôi.

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

Tôi đã thêm hai dòng danh sách đen DIGEST-MD5 và bật PLAIN SASLMechanism và cũng xóa địa chỉ IP khỏi tên người dùng.

Để bạn tham khảo ở đây là mã làm việc hoàn chỉnh của tôi.

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

Cảm ơn rất nhiều! Việc thiếu tài liệu về vấn đề này chỉ đơn giản là xấu hổ, tôi đã tìm kiếm các mẩu thông tin về điều này trong 2 ngày mà không có nhiều thành công ... Bài viết của bạn là của xa hữu ích nhất mà tôi đã nhìn thấy. – Fingolfin

4

Đối với chính sách cấp phép,

PLAIN Auth - ĐỒNG BẰNG Unblacklist, Blacklist SHA-1 VÀ MD5

MD5 Auth - Unblacklist MD5, Blacklist SHA-1 VÀ ĐỒNG BẰNG

SCRAM-SHA -1 Auth - Unblacklist SCRAM-SHA-1 & PLAIN, Danh sách đen MD5

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

AuthNames: PLAIN, SCRAM-SHA-1, MD5

** Kiểm tra tại phía máy chủ mà rằng phương pháp auth kích hoạt

Các vấn đề liên quan