Не могу войти в чат Facebook через XMPP на AndroidAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Не могу войти в чат Facebook через XMPP на Android

Сообщение Anonymous »

Я написал приложение для Android, в которое хочу интегрировать чат через XMPP.
Я вошел в Facebook с разрешением XMPPLogin. Но когда я хочу войти в Facebook через XMPP, я получаю следующий XML-ответ:

Код: Выделить всё

RCV  (1095775528): 
вызывает эту ошибку:

Код: Выделить всё

SASL authentication failed using mechanism X-FACEBOOK-PLATFORM:
at org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java:341)
at org.jivesoftware.smack.XMPPConnection.login(XMPPConnection.java:242)
at org.jivesoftware.smack.Connection.login(Connection.java:371)
at com.example.messenger.ChatActivity.testLogin(ChatActivity.java:240)
at com.example.messenger.ChatActivity.access$0(ChatActivity.java:189)
at com.example.messenger.ChatActivity$1$1.run(ChatActivity.java:70)
at java.lang.Thread.run(Thread.java:856)
Вот как я использую вход

Код: Выделить всё

private void testLogin(){

ConnectionConfiguration config = new ConnectionConfiguration("chat.facebook.com", 5222, "chat.facebook.com");
Log.i("XMPP Client", "ConnectionConfig");
config.setSASLAuthenticationEnabled(true);
config.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
config.setDebuggerEnabled(true);

Log.i("XMPP Client", "config Complete");

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
config.setTruststoreType("AndroidCAStore");
config.setTruststorePassword(null);
config.setTruststorePath(null);

} else {
config.setTruststoreType("BKS");
String path = System.getProperty("javax.net.ssl.trustStore");
if (path == null)
path = System.getProperty("java.home") + File.separator + "etc"
+ File.separator + "security" + File.separator
+ "cacerts.bks";
config.setTruststorePath(path);
}

Log.i("XMPP Client", "config if else complete");
xmpp = new XMPPConnection(config);

SASLAuthentication.registerSASLMechanism("X-FACEBOOK-PLATFORM",SASLXFacebookPlatformMechanism.class);
SASLAuthentication.supportSASLMechanism("X-FACEBOOK-PLATFORM", 0);

Log.i("XMPP Client", "new Connection and sasl auth done");
try {
xmpp.connect();
Log.i("XMPPClient","Connected to " + xmpp.getHost());

} catch (XMPPException e1) {
Log.i("XMPPClient","Unable to " + xmpp.getHost());

e1.printStackTrace();
}
Log.i("XMPP Client", "xmpp connect done");
try {

String apiKey = Session.getActiveSession().getApplicationId();
String sessionKey = Session.getActiveSession().getAccessToken();

String sessionSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

Log.i("XMPP Client", Session.getActiveSession().getApplicationId());
xmpp.login(apiKey + "|" + sessionKey, sessionSecret , "Messenger");

Log.i("XMPPClient"," its logined ");

Log.i("Connected",""+xmpp.isConnected());

if ( xmpp.isConnected()){
Presence presence = new Presence(Presence.Type.available);
xmpp.sendPacket(presence);

}

} catch (XMPPException e) {
e.printStackTrace();
}
}
и это мой класс механизма платформы SASL Facebook

Код: Выделить всё

package com.example.messenger;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;

import org.apache.harmony.javax.security.auth.callback.CallbackHandler;
import org.apache.harmony.javax.security.sasl.Sasl;
import org.jivesoftware.smack.SASLAuthentication;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.sasl.SASLMechanism;
import org.jivesoftware.smack.util.Base64;

public class SASLXFacebookPlatformMechanism extends SASLMechanism
{

private static final String NAME              = "X-FACEBOOK-PLATFORM";

private String              apiKey            = "";
private String              applicationSecret = "";
private String              sessionKey        = "";

/**
* Constructor.
*/
public SASLXFacebookPlatformMechanism(SASLAuthentication saslAuthentication)
{
super(saslAuthentication);
}

@Override
protected void authenticate() throws IOException, XMPPException
{

getSASLAuthentication().send(new AuthMechanism(NAME,  ""));
}

@Override
public void authenticate(String apiKeyAndSessionKey, String host,
String applicationSecret) throws IOException, XMPPException
{
if (apiKeyAndSessionKey == null || applicationSecret == null)
{
throw new IllegalArgumentException("Invalid parameters");
}

String[] keyArray = apiKeyAndSessionKey.split("\\|", 2);
if (keyArray.length < 2)
{
throw new IllegalArgumentException(
"API key or session key is not present");
}

this.apiKey = keyArray[0];
this.applicationSecret = applicationSecret;
this.sessionKey = keyArray[1];

String[] mechanisms = { "DIGEST-MD5" };
Map props = new HashMap();
this.sc =
Sasl.createSaslClient(mechanisms, null, "xmpp", host, props,
this);
authenticate();
}

@Override
public void authenticate(String username, String host, CallbackHandler cbh)
throws IOException, XMPPException
{
String[] mechanisms = { "DIGEST-MD5" };
Map props = new HashMap();
this.sc =
Sasl.createSaslClient(mechanisms, null, "xmpp", host, props,
cbh);
authenticate();
}

@Override
protected String getName()
{
return NAME;
}

@Override
public void challengeReceived(String challenge) throws IOException
{
byte[] response = null;

if (challenge != null)
{
String decodedChallenge = new String(Base64.decode(challenge));
Map parameters = getQueryMap(decodedChallenge);

String version = "1.0";
String nonce = parameters.get("nonce");
String method = parameters.get("method");

long callId = new GregorianCalendar().getTimeInMillis();

String sig =
"api_key=" + apiKey + "call_id=" + callId + "method="
+ method + "nonce=" + nonce + "session_key="
+ sessionKey + "v=" + version + applicationSecret;

try
{
sig = md5(sig);
} catch (NoSuchAlgorithmException e)
{
throw new IllegalStateException(e);
}

String composedResponse =
"api_key=" + URLEncoder.encode(apiKey, "utf-8")
+ "&call_id=" + callId + "&method="
+ URLEncoder.encode(method, "utf-8") + "&nonce="
+ URLEncoder.encode(nonce, "utf-8")
+ "&session_key="
+ URLEncoder.encode(sessionKey, "utf-8") + "&v="
+ URLEncoder.encode(version, "utf-8") + "&sig="
+ URLEncoder.encode(sig, "utf-8");

response = composedResponse.getBytes("utf-8");
}

String authenticationText = "";

if (response != null)
{
authenticationText =
Base64.encodeBytes(response, Base64.DONT_BREAK_LINES);
}

// Send the authentication to the server
getSASLAuthentication().send(new Response(authenticationText));
}

private Map getQueryMap(String query)
{
Map map = new HashMap();
String[] params = query.split("\\&");

for (String param : params)
{
String[] fields = param.split("=", 2);
map.put(fields[0], (fields.length > 1 ? fields[1] : null));
}

return map;
}

private String md5(String text) throws NoSuchAlgorithmException,
UnsupportedEncodingException
{
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(text.getBytes("utf-8"), 0, text.length());
return convertToHex(md.digest());
}

private String convertToHex(byte[] data)
{
StringBuilder buf = new StringBuilder();
int len = data.length;

for (int i = 0; i < len;  i++)
{
int halfByte = (data[i] >>> 4) & 0xF;
int twoHalfs = 0;

do
{
if (0 

Подробнее здесь: [url]https://stackoverflow.com/questions/20889971/cant-log-in-facebook-chat-via-xmpp-on-android[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»