简体   繁体   English

Smack和SASL身份验证错误-没有已知的身份验证机制

[英]Smack and SASL Authentication error - No known authentication mechanisims

I am trying to create an XMPP client using the latest version of Smack 4.1.0-beta. 我正在尝试使用最新版本的Smack 4.1.0-beta创建XMPP客户端。 But i am running into an error when trying login into a local running OpenFire server. 但是我尝试登录到本地运行的OpenFire服务器时遇到错误。

org.jivesoftware.smack.SmackException: SASL Authentication failed. No known authentication mechanisims.

I tried all kind of combinations of user credentials but so far no luck. 我尝试了各种类型的用户凭据组合,但到目前为止还没有运气。 When trying to connect to the server with Pidgin or Adium al is ok. 尝试使用Pidgin或Adium连接到服务器时可以。 Any clue what i am missing in the code? 任何提示我代码中缺少什么?

XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
            .setUsernameAndPassword("admin", "admin")
            .setServiceName("localhost")
            .setHost("localhost")
            .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
            .setPort(5222)
            .build();

    AbstractXMPPConnection connection = new XMPPTCPConnection(config);

    try {

        connection.connect();

        connection.login();

        connection.disconnect();

    } catch (SmackException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (XMPPException e) {
        e.printStackTrace();
    }

Here is the complete solution please look at this carefully... 这是完整的解决方案,请仔细看一下...

public class NewClientActivity extends Activity {
    EditText etUsername, etPassword;
    Button bSubmit;
    AbstractXMPPConnection mConnection;
    ConnectionListener connectionListener = new ConnectionListener() {
        @Override
        public void connected(XMPPConnection xmppConnection) {
            Log.d("xmpp", "connected");
            try {
                SASLAuthentication.registerSASLMechanism(new SASLMechanism() {
                    @Override
                    protected void authenticateInternal(CallbackHandler callbackHandler) throws SmackException {

                    }

                    @Override
                    protected byte[] getAuthenticationText() throws SmackException {
                        byte[] authcid = toBytes('\u0000' + this.authenticationId);
                        byte[] passw = toBytes('\u0000' + this.password);
                        return ByteUtils.concact(authcid, passw);
                    }

                    @Override
                    public String getName() {
                        return "PLAIN";
                    }

                    @Override
                    public int getPriority() {
                        return 410;
                    }

                    @Override
                    public void checkIfSuccessfulOrThrow() throws SmackException {

                    }

                    @Override
                    protected SASLMechanism newInstance() {
                        return this;
                    }
                });
                mConnection.login();
            } catch (XMPPException e) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(NewClientActivity.this, "Incorrect username or password", Toast.LENGTH_LONG).show();
                    }
                });
                e.printStackTrace();
            } catch (SmackException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void authenticated(XMPPConnection xmppConnection, boolean b) {
            Log.d("xmpp", "authenticated");
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(NewClientActivity.this,"Logged in successfully...",Toast.LENGTH_LONG ).show();
                }
            });
        }

        @Override
        public void connectionClosed() {
            Log.d("xmpp", "connection closed");
        }

        @Override
        public void connectionClosedOnError(Exception e) {
            Log.d("xmpp", "cononection closed on error");
        }

        @Override
        public void reconnectionSuccessful() {
            Log.d("xmpp", "reconnection successful");
        }

        @Override
        public void reconnectingIn(int i) {
            Log.d("xmpp", "reconnecting in " + i);
        }

        @Override
        public void reconnectionFailed(Exception e) {
            Log.d("xmpp", "reconnection failed");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_new_client);
        findViews();
    }

    private void findViews() {
        etUsername = (EditText) findViewById(R.id.etUsername);
        etPassword = (EditText) findViewById(R.id.etPassword);
        bSubmit = (Button) findViewById(R.id.bSubmit);
        bSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String[] params = new String[]{etUsername.getText().toString(), etPassword.getText().toString()};
                new Connect().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
            }
        });
    }

    class Connect extends AsyncTask<String, Void, Void> {
        @Override
        protected Void doInBackground(String... params) {

            XMPPTCPConnectionConfiguration config = null;
            XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();
            builder.setServiceName("192.168.1.60").setHost("192.168.1.60")
                    .setDebuggerEnabled(true)
                    .setPort(5222)
                    .setUsernameAndPassword(params[0], params[1])
                    .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                    .setCompressionEnabled(false);
            config = builder.build();

            mConnection = new XMPPTCPConnection(config);
            try {
                mConnection.setPacketReplyTimeout(10000);
                mConnection.addConnectionListener(connectionListener);
                mConnection.connect();
            } catch (SmackException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (XMPPException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
}

Update :- For smack 4.2.0-beta2 version use below code to configure XmppConnection for PLAIN authentication. 更新 : -对于嫌4.2.0-β2版本的使用下面的代码来配置XmppConnectionPLAIN认证。

XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();
builder.setHost("example.com");
builder.setPort(5222);
/*builder.setServiceName("example.com");*/ //for older version < 4.2.0-beta2
try
{
    builder.setXmppDomain(JidCreate.domainBareFrom("example.com"));
}
catch (XmppStringprepException e)
{
    e.printStackTrace();
}
/*builder.setServiceName("example.com");*/
builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
builder.setCompressionEnabled(true);
builder.setConnectTimeout(30000);
/*builder.setSendPresence(false);*/
try
{
    TLSUtils.acceptAllCertificates(builder);
}
catch (NoSuchAlgorithmException|KeyManagementException e)
{
    e.printStackTrace();
}
TLSUtils.disableHostnameVerificationForTlsCertificates(builder);
final Map<String, String> registeredSASLMechanisms = SASLAuthentication.getRegisterdSASLMechanisms();
for(String mechanism:registeredSASLMechanisms.values())
{
    SASLAuthentication.blacklistSASLMechanism(mechanism);
}
SASLAuthentication.unBlacklistSASLMechanism(SASLPlainMechanism.NAME);

xmppConnection=new XMPPTCPConnection(builder.build());

I wrongly imported the wrong dependencies. 我错误地导入了错误的依赖项。 When checking out the documentation ( https://github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guide ) importing the correct dependencies using Gradle solved the issue. 在检查文档( https://github.com/igniterealtime/Smack/wiki/Smack-4.1-Readme-and-Upgrade-Guide )时,使用Gradle导入正确的依赖项可以解决此问题。

compile("org.igniterealtime.smack:smack-java7:4.1.0-beta1")
compile("org.igniterealtime.smack:smack-tcp:4.1.0-beta1")
compile("org.igniterealtime.smack:smack-extensions:4.1.0-beta1")

尝试使用IP地址作为主机/服务名

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM