Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Smack和SASL身份验证错误-没有已知的身份验证机制_Java_Xmpp_Openfire_Smack - Fatal编程技术网

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

Java Smack和SASL身份验证错误-没有已知的身份验证机制,java,xmpp,openfire,smack,Java,Xmpp,Openfire,Smack,我正在尝试使用最新版本的Smack 4.1.0-beta创建一个XMPP客户端。但我在尝试登录到本地运行的OpenFire服务器时遇到错误 org.jivesoftware.smack.SmackException: SASL Authentication failed. No known authentication mechanisims. 我尝试了各种用户凭证的组合,但到目前为止没有成功。当尝试使用Pidgin或Adium连接到服务器时,al是正常的。你知道我在代码里遗漏了什么吗 XMP

我正在尝试使用最新版本的Smack 4.1.0-beta创建一个XMPP客户端。但我在尝试登录到本地运行的OpenFire服务器时遇到错误

org.jivesoftware.smack.SmackException: SASL Authentication failed. No known authentication mechanisims.
我尝试了各种用户凭证的组合,但到目前为止没有成功。当尝试使用Pidgin或Adium连接到服务器时,al是正常的。你知道我在代码里遗漏了什么吗

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

尝试使用主机/servicename的ip地址

我错误地导入了错误的依赖项。在签出文档()时,使用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")

这是完整的解决方案,请仔细查看

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

效验如神u r Xmpp Super Hero:DThanks@KhalidElSayed,我最近更新了答案,如果您使用的是更新版本的
smack
,即4.2.0-beta2,请使用它谢谢@gopalinghsirvi更新的答案,u r awesome:)设置数据包回复超时。这不是一个好主意。当移动到另一台服务器时,IP可能会发生变化,您必须更新商店中发布的应用程序。这需要时间,不是一个好主意。
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());