Неверное исключение кодирования при подключении к FCM с использованием Smack Library

Я пытаюсь подключиться к FCM, используя библиотеку smack:

Вот что я пробовал. Это работает, но я получаю исключение, когда соединение пытается войти в систему.

new Thread(new Runnable(){
XMPPTCPConnectionConfiguration.Builder configBuilder =     XMPPTCPConnectionConfiguration.builder();
private Handler umm;
@Override
public void run() {
                        configBuilder.setSecurityMode(XMPPTCPConnectionConfiguration.SecurityMode.disabled );
configBuilder.setServiceName("fcm-xmpp.googleapis.com");
configBuilder.setHost("fcm-xmpp.googleapis.com");//MAYBE PROBLEM HERE??
configBuilder.setPort(5236);
configBuilder.setCompressionEnabled(false);
configBuilder.setSendPresence(true);
                         configBuilder.setSocketFactory(SSLSocketFactory.getDefault());
InterfaceClass.FCMconnection = new XMPPTCPConnection(configBuilder.build());
umm = yes;

try {
InterfaceClass.FCMconnection.connect();
Log.v("pony", "white horse");
//InterfaceClass.FCMloggin.start();
android.os.Message y4 = android.os.Message.obtain();
y4.what = LOGINTOFCM;
umm.sendMessage(y4);
//the rest of the thread is just exception handling in catch clauses

Как только мой обработчик получает сообщение, я пытаюсь войти в систему с таким соединением:

try {                        FCMconnection.login("[email protected]","SERVER_KEY");
Log.d("black","r2d2");
} catch (XMPPException e) {//exception thrown here
e.printStackTrace();
Log.d("black","maity "+e);

Я получаю следующее исключение: «smack.sasl.SASLErrorException: SASLError с использованием X-OAUTH2: неверная кодировка»

Теперь из документации ясно сказано, что необходимо реализовать простой механизм SASL, но я не знаю, как это сделать? Вот что говорится в документации:

«Соединение имеет два важных требования:

Вы должны инициировать соединение Transport Layer Security (TLS). Обратите внимание, что в настоящее время CCS не поддерживает расширение STARTTLS. CCS требует механизма аутентификации SASL PLAIN с использованием @gcm.googleapis.com (идентификатор отправителя FCM) и ключа сервера в качестве пароля, где идентификатор отправителя и ключ сервера являются значения, которые вы собрали при настройке клиентского приложения. См. клиентскую документацию для вашей платформы для получения информации о получении этих учетных данных».

Кто-нибудь знает, что может быть причиной этого исключения? Как мне подключиться к FCM с библиотекой smack?

Спасибо за любой совет.


person i_o    schedule 01.07.2016    source источник


Ответы (1)


В соответствии с документацией для подключения к FCM по протоколу XMPP требуется:

1) TLS-соединение на транспортном уровне, для этого создайте SSLContext с использованием расширения протокола TLS.

2) Обычный протокол SASL, убедитесь, что «smack-sasl-javax-4.1.8.jar» интегрирован в вашу настройку сборки. Это заняло у меня много времени, чтобы понять

3) Хост, имя службы и номер порта верны (см. фрагмент кода ниже)

Ниже фрагмент кода отлично работает для меня:

SSLContext sslContext = null;
try {
    sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, null, null);
} catch (Exception e) {
    //Failed to get default ssl context with TLS enabled... something can't proceed further
}
XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder();
config.setConnectTimeout(CONNECTION_TIMEOUT);
config.setSendPresence(true);
config.setCustomSSLContext(sslContext);
config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
config.setServiceName("gcm.googleapis.com");
config.setHost("fcm-xmpp.googleapis.com");
config.setPort(5236);//not production server
config.setDebuggerEnabled(true);
config.setCompressionEnabled(true);
config.setSocketFactory(sslContext.getSocketFactory());
(mConnection = new XMPPTCPConnection(config.build())).addConnectionListener(ConnectionSession.this);
mConnection.setPacketReplyTimeout(REPLY_TIMEOUT);
mConnection.connect();
mConnection.login(userID, password); //use your app server credential here

Smack версии 4.8.1 реализован и протестирован из установки openfire.

Надеюсь, это поможет кому-то!!

person Inderjeet Sharma    schedule 29.09.2016