アプリをaSmack
からSmack 4.1.1
に移行しようとしています。ただし、aSmackを使用しているときにSmackを使用すると、同じサーバーとログインの詳細を使用できません。
これが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-MD5でも同じです。名前を変更するだけです。
これは私がサーバーから取得しているものです-
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>
ここの問題は何でしょうか?私は3つのメカニズム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:
Smack 4.1.1のソリューションが必要です。私のコードはすでにaSmackで正常に動作しています。Smackでコードをアップグレードするために必要です。もうはっきりしていると思います。
わかりました、それはむしろばかげた間違いでした。現在のコードは完全に問題ありません。パスワードの代わりにユーザー名を誤って入力しました。 aSmackに戻ろうとしたときにエラーについて知りました。
私は同じエラーに直面していました。
Xmppサーバーに接続した後、私は呼んでいました
mConnection.login("[email protected]", "ilink@2012");
そしてそれは働いていませんでした。
問題を解決するために、コードに次の変更を加えました。
SASLAuthentication.unBlacklistSASLMechanism("PLAIN");
SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5");
mConnection.login("test", "ilink@2012");
DIGEST-MD5をブラックリストに登録してPLAIN SASLMechanismを有効にする2行を追加し、ユーザー名から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...");
}
}
}
認可ポリシーについては、
PLAIN Auth-Unblacklist PLAIN、Blacklist SHA-1およびMD5
MD5 Auth-ブラックリスト解除MD5、ブラックリストSHA-1およびプレーン
SCRAM-SHA-1 Auth-Unblacklist SCRAM-SHA-1&PLAIN、Blacklist MD5
SASLAuthentication.unBlacklistSASLMechanism("AuthName");
SASLAuthentication.blacklistSASLMechanism("AuthName");
AuthNames:PLAIN
、SCRAM-SHA-1
、MD5
**サーバー側で、どの認証方法が有効になっているかを確認します
SASLAuthentication.blacklistSASLMechanism("SCRAM-SHA-1");
SASLAuthentication.blacklistSASLMechanism("DIGEST-MD5");
SASLAuthentication.unBlacklistSASLMechanism("PLAIN");
非SSL接続のために私のために働いた。 (接続されたメソッドで)
編集:ユーザーアカウントがサーバーで作成されている場合、このエラーが発生する可能性があります。サインアップ(アカウントの作成)またはログインのどちらから来たかを確認します。
私は次のプロパティがあなたのために働くと思います、私は3.1を使用しています
config.setVerifyChainEnabled(false);
config.setReconnectionAllowed(true);
config.setSASLAuthenticationEnabled(false);
config.setSecurityMode(SecurityMode.disabled);
config.setDebuggerEnabled(false);