2012-05-11 2 views
0

Я использую asmack для входа в facebook для общения с помощью my apikey и токена доступа! Но логин не работает со следующим исключением:Клиент Android-facebook chat с помощью xmpp

Ошибка аутентификации SASL с использованием механизма X-FACEBOOK-PLATFORM: «Я хочу знать, откуда я могу правильно работать, расширяет класс SASLMechanism, чтобы это сделать, а также помочь мне для входа в систему я использую следующий класс: custom. И для создания логина: -

SASLAuthentication.registerSASLMechanism("X-FACEBOOK-PLATFORM",  SASLXFacebookPlatformMechanism.class);  
      SASLAuthentication.supportSASLMechanism("X-FACEBOOK-PLATFORM", 0);  
      connection.connect(); 
      connection.login(facebook.getAppId(), facebook.getAccessToken()); 

// Но это не работает

+0

Гопал есть у меня решение для этого вопроса –

ответ

1

Я испытал это один и он работал на меня.

Прежде всего отредактируйте свой класс SASLXFacebookPlatformMechanism. Скопируйте и вставьте этот код.

package com.facebook.android; 

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; 

import android.util.Log; 

public class SASLXFacebookPlatformMechanism extends SASLMechanism { 

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

    private String    apiKey   = ""; 
    private String    accessToken  = ""; 

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

    @Override 
    protected void authenticate() throws IOException, XMPPException { 
     getSASLAuthentication().send(new AuthMechanism(NAME, "")); 
    } 

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

     this.apiKey = apiKey; 
     this.accessToken = accessToken; 
     this.hostname = host; 

     String[] mechanisms = { "DIGEST-MD5" }; 
     Map<String, String> props = new HashMap<String, String>(); 
     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<String, String> props = new HashMap<String, String>(); 
     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<String, String> parameters = getQueryMap(decodedChallenge); 

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

      String composedResponse = 
       "method=" + URLEncoder.encode(method, "utf-8") + 
         "&nonce=" + URLEncoder.encode(nonce, "utf-8") + 
         "&access_token=" + URLEncoder.encode(accessToken, "utf-8") + 
         "&api_key=" + URLEncoder.encode(apiKey, "utf-8") + 
         "&call_id=0" + 
         "&v=" + URLEncoder.encode(version, "utf-8"); 
      response = composedResponse.getBytes(); 
     } 

     String authenticationText = ""; 

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

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

    private Map<String, String> getQueryMap(String query) { 
     Map<String, String> map = new HashMap<String, String>(); 
     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; 
    } 
} 

Затем использовать этот метод в классе деятельности, где вы хотите, чтобы войти в facebook

private void LoginToFaceBook(){ 
     ConnectionConfiguration config = new ConnectionConfiguration("chat.facebook.com", 5222); 
     config.setSASLAuthenticationEnabled(true); 
     config.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled); 
     xmpp = new XMPPConnection(config); 
     SASLAuthentication.registerSASLMechanism("X-FACEBOOK-PLATFORM",SASLXFacebookPlatformMechanism.class); 
     SASLAuthentication.supportSASLMechanism("X-FACEBOOK-PLATFORM", 0); 
     Log.i("XMPPClient", 
       "Access token to " + mFacebook.getAccessToken()); 
     Log.i("XMPPClient", 
       "Access token to " + mFacebook.getAppId()); 
     Log.i("XMPPClient", 
       "Access token to " + mFacebook.getAccessToken()); 
     try { 
      xmpp.connect(); 
      Log.i("XMPPClient", 
        "Connected to " + xmpp.getHost()); 

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

      e1.printStackTrace(); 
     } 
     try { 
      xmpp.login(PreferenceConnector.APP_ID, mFacebook.getAccessToken()); 




     } catch (XMPPException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

то, где мы должны добавить имя пользователя и пароль –

+0

Вам нужно будет ввести токен доступа в эту строку. xmpp.login (PreferenceConnector.APP_ID, mFacebook.getAccessToken()); – Jan

+0

вручную мне нужно ввести accesstoken ah dude, сначала это мне нужно войти в facebook, тогда я должен использовать этот код ah –

Смежные вопросы