我正在尝试将我的应用从aSmack
转移到Smack 4.1.1
。但是我在使用相同的服务器和登录细节时遇到麻烦,而在使用Smack时,它在aSmack上工作得非常好。
这是我在[{1}} -
中登录的旧代码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);
}
此异常与SCRAM和DIGEST-MD5相同。它只是改变了名称。
这是我从服务器获得的内容 -
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)
这可能是什么问题?我尝试了所有三种机制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
PS:
我需要Smack 4.1.1中的解决方案。我的代码已经在aSmack中运行良好,我需要它在Smack中升级它。我想现在已经很清楚了。
答案 0 :(得分:20)
我遇到了同样的错误。
连接到xmpp服务器后,我正在调用
mConnection.login("test@192.168.0.166", "ilink@2012");
它无效。
为了解决这个问题,我在代码中做了以下更改。
SASLAuthentication.unBlacklistSASLMechanism("PLAIN");
SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5");
mConnection.login("test", "ilink@2012");
我添加了两行黑名单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", "ilink@2012");
} 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...");
}
}
}
答案 1 :(得分:5)
对于授权政策,
PLAIN Auth - Unblacklist PLAIN,黑名单SHA-1和MD5
MD5 Auth - Unblacklist MD5,黑名单SHA-1和PLAIN
SCRAM-SHA-1 Auth - Unblacklist SCRAM-SHA-1&amp; PLAIN,黑名单MD5
SASLAuthentication.unBlacklistSASLMechanism("AuthName");
SASLAuthentication.blacklistSASLMechanism("AuthName");
AuthNames:PLAIN
,SCRAM-SHA-1
,MD5
**在服务器端检查启用了哪个auth方法
答案 2 :(得分:3)
好吧,这是一个愚蠢的错误。目前的代码非常好。我不小心把用户名代替了密码。当我试图回到aSmack时,我知道了这个错误。
答案 3 :(得分:3)
SASLAuthentication.blacklistSASLMechanism("SCRAM-SHA-1");
SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5");
SASLAuthentication.unBlacklistSASLMechanism("PLAIN");
为我工作,用于非SSL连接。 (有关连接方法)
编辑: 如果已在服务器上创建用户帐户,则可能会出现此错误。检查它是来自注册(创建帐户)还是来自登录。
答案 4 :(得分:0)
我认为以下属性适合您,我使用的是3.1
config.setVerifyChainEnabled(false);
config.setReconnectionAllowed(true);
config.setSASLAuthenticationEnabled(false);
config.setSecurityMode(SecurityMode.disabled);
config.setDebuggerEnabled(false);