Come eseguire l'authentication a Google Talk con il token di authentication di AccountManager utilizzando l'API Smack?

Questa domanda è simile a: autenticare su Google Talk (XMPP, Smack) utilizzando un authToken

  1. Ho la class android.accounts.AccountManager ei suoi methods per get il token di authentication per l'account Google:

  2. Qual è il modo giusto per importre un progetto Android Studio in un repository SVN?
  3. Test di unità Activity.startService () chiamata?
  4. Come faccio a rimuovere una notifica in primo piano in Android Lollipop?
  5. Come evitare di ingrandire ImageView da essere trascinato fuori dello schermo?
  6. SwipeRefreshLayout interferisce con ScrollView in un ViewPager
  7. Android, come sfocare / attività di vetro / gelo
  8. public AccountManagerFuture<Bundle> getAuthToken (Account account, String authTokenType, Bundle options, Activity activity, AccountManagerCallback<Bundle> callback, Handler handler) 
  9. So come preparare l'XML di authentication:

     jidAndToken ="\0" + UTF8(YOURUSERNAME@gmail.com) + "\0" + Auth 

    (where "\ 0" è destinato ad essere un singolo ottetto con valore zero). Utilizzalo nell'authorization SASL iniziale:

     <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='X-GOOGLE-TOKEN'>Base64(jidAndToken)</auth> 

Ma non sono riuscito ad integrarlo con Smack API come qualcuno ha fatto per la chat facebook qui: XMPP con libreria Java Asmack che support X-FACEBOOK-PLATFORM

Qualcuno può aiutarmi?

  • Come impostare lo stile del carattere in grassetto, corsivo e sottolineato in un Android TextView?
  • Integra il riconoscimento di Google Voice nell'applicazione Android
  • I servizi di Google Play sono obsoleti. Richiede 3159100 ma ha trovato 3158130
  • Corretto modo per rimuovere tutti i frammenti (Child)
  • Modifica del carattere in AlertDialog
  • Come visualizzare Toast in posizione diversa 2
  • 2 Solutions collect form web for “Come eseguire l'authentication a Google Talk con il token di authentication di AccountManager utilizzando l'API Smack?”

    Vijay,

    Il tuo codice mi ha aiutato molto grazie! Sto postando qui per offrire la mia soluzione al problema di utilizzare AccountManager per accedere a Google Talk. Finora non ho trovato una soluzione completa là fuori, ma ho sviluppato la mia basata sul codice di cui sopra e correggendo alcune righe che non funzionano.

    Ci sono due parti della soluzione. Il primo è basato sull'idea e sul codice di cui sopra. È quello di creare una sottoclass di SASLMechanism:

     import java.io.IOException; import java.net.URLEncoder; import org.jivesoftware.smack.SASLAuthentication; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.Packet; import org.jivesoftware.smack.sasl.SASLMechanism; import android.util.Base64; import android.util.Log; public class GTalkOAuth2 extends SASLMechanism { public static final String NAME="X-GOOGLE-TOKEN"; public GTalkOAuth2(SASLAuthentication saslAuthentication) { super(saslAuthentication); } @Override protected String getName() { return NAME; } static void enable() { } @Override protected void authenticate() throws IOException, XMPPException { String authCode = password; String jidAndToken = "\0" + URLEncoder.encode( authenticationId, "utf-8" ) + "\0" + authCode; StringBuilder stanza = new StringBuilder(); stanza.append( "<auth mechanism=\"" ).append( getName() ); stanza.append( "\" xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">" ); stanza.append( new String(Base64.encode( jidAndToken.getBytes( "UTF-8" ), Base64.DEFAULT ) ) ); stanza.append( "</auth>" ); Log.v("BlueTalk", "Authentication text is "+stanza); // Send the authentication to the server getSASLAuthentication().send( new Auth2Mechanism(stanza.toString()) ); } public class Auth2Mechanism extends Packet { String stanza; public Auth2Mechanism(String txt) { stanza = txt; } public String toXML() { return stanza; } } /** * Initiating SASL authentication by select a mechanism. */ public class AuthMechanism extends Packet { final private String name; final private String authenticationText; public AuthMechanism(String name, String authenticationText) { if (name == null) { throw new NullPointerException("SASL mechanism name shouldn't be null."); } this.name = name; this.authenticationText = authenticationText; } public String toXML() { StringBuilder stanza = new StringBuilder(); stanza.append("<auth mechanism=\"").append(name); stanza.append("\" xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">"); if (authenticationText != null && authenticationText.trim().length() > 0) { stanza.append(authenticationText); } stanza.append("</auth>"); return stanza.toString(); } } } 

    La seconda parte è l'uso di esso. La cosa grande che nessun altro esempio mi ha dato è che quando ottiene il token dal sistema AccountManager, il tipo di token non è "ah" ma "mail". L'idea era là in esempi che facevano una comunicazione diretta con i server google per get il token, ma non per richiederlo da AccountManager. Metteteli insieme vi dà la possibilità di fare quanto segue nel codice del driver. Crea una function per get il token:

     public String getAuthToken(String name) { Context context = getApplicationContext(); Activity activity = this; String retVal = ""; Account account = new Account(name, "com.google"); AccountManagerFuture<Bundle> accFut = AccountManager.get(context).getAuthToken(account, "mail", null, activity, null, null); try { Bundle authTokenBundle = accFut.getResult(); retVal = authTokenBundle.get(AccountManager.KEY_AUTHTOKEN).toString(); } catch (OperationCanceledException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (AuthenticatorException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return retVal; } 

    E poi chiamarlo dopo aver accertato che verrà utilizzato il sistema SASL corretto:

     SASLAuthentication.registerSASLMechanism( GTalkOAuth2.NAME, GTalkOAuth2.class ); SASLAuthentication.supportSASLMechanism( GTalkOAuth2.NAME, 0 ); config.setSASLAuthenticationEnabled(true); String saslAuthString = getAuthToken(acct.name); connection = new XMPPConnection(config); try { connection.connect(); connection.login(name, saslAuthString); } catch (XMPPException e) { // Most likely an expired token // Invalidate the token and start over. There are example of this available } 

    Felice Google Talking!

    So che questo thread è un po 'vecchio, ma ho pensato che avrei aiutato … Quindi, ecco la mia class che sembra funzionare con la connessione con Gtalk utilizzando il meccanismo del token. veramente, vorrei piuttosto andare con oauth2 .. ma questo sembra funzionare bene. Assicurati che il tuo nome utente sia come "<your_user>@gmail.com" e dovrebbe funzionare:

     public class GoogleTalkAuthentication extends SASLMechanism { static { SASLAuthentication.registerSASLMechanism( "X-GOOGLE-TOKEN", GoogleTalkAuthentication.class ); SASLAuthentication.supportSASLMechanism( "X-GOOGLE-TOKEN", 0 ); } public GoogleTalkAuthentication( SASLAuthentication saslAuthentication ) { super( saslAuthentication ); } @Override protected String getName() { return "X-GOOGLE-TOKEN"; } @Override public void authenticate( String username, String host, String password ) throws IOException, XMPPException { super.authenticate( username, host, password ); } @Override protected void authenticate() throws IOException, XMPPException { String authCode = getAuthCode( authenticationId, password ); String jidAndToken = "\0" + URLEncoder.encode( authenticationId, "utf-8" ) + "\0" + authCode; StringBuilder stanza = new StringBuilder(); stanza.append( "<auth mechanism=\"" ).append( getName() ); stanza.append( "\" xmlns=\"urn:ietf:params:xml:ns:xmpp-sasl\">" ); stanza.append( Base64.encode( jidAndToken.getBytes( "UTF-8" ) ) ); stanza.append( "</auth>" ); // Send the authentication to the server getSASLAuthentication().send( stanza.toString() ); } public static String getAuthCode( String username, String password ) throws IOException { StringBuilder urlToRead = new StringBuilder(); urlToRead.append( "https://www.google.com/accounts/ClientLogin?accountType=GOOGLE&service=mail&" ); urlToRead.append( "Email=" + username + "&" ); urlToRead.append( "Passwd=" + password ); URL url = new URL( urlToRead.toString() ); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod( "GET" ); BufferedReader rd = new BufferedReader( new InputStreamReader( conn.getInputStream() ) ); try { String line; while ( ( line = rd.readLine() ) != null ) { if ( line.startsWith( "Auth=" ) ) return line.substring( 5 ); } return null; } finally { rd.close(); } } public static void main( String[] args ) throws IOException { String username = ""; String password = ""; String authCode = getAuthCode( username, password ); String jidAndToken = "\0" + URLEncoder.encode( username, "utf-8" ) + "\0" + authCode; System.err.println( authCode ); System.err.println( "Code:" + jidAndToken ); } } 

    In bocca al lupo.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.