2010-11-17 20 views
9

Quiero preguntar, ¿cuál es la mejor manera de autenticar al usuario con su cuenta de Google ya configurada en el teléfono. He consultado primero el ClientLogin, pero no es lo que quiero porque requiere que los usuarios ingresen el inicio de sesión/contraseña en mi aplicación. Puedo hacerlo con OAuth pero allí debería pedirle al usuario que ingrese sus credenciales en el navegador, lo que tampoco es preferible. Quiero usar AccountManager (he observado que contiene el método getPassword para una cuenta particular, pero no funcionó), si es posible usar de alguna manera AccountManager + ClientLogin o AccountManager + OAuth dime por favor. Como resultado, quiero tener capacidades para iniciar sesión con la cuenta de usuario de Google sin preguntar su nombre de usuario/contraseña (con la confirmación en el dispositivo Android, por supuesto). No estoy seguro de que sea posible, pero si hay alguna forma de implementar esto, por favor diríjanme cómo. ..Android: autenticación de Google

+0

estaría bien si votaras por una respuesta correcta para tu pregunta. o, en caso de que ninguno satisfaga sus necesidades, los comentó. nos hace, respondedores (usted hizo un comentario uno en el momento) se siente apreciado por nuestros esfuerzos para ayudarlo. :) –

Respuesta

0

Desde una pregunta stackOverflow en feb2010: Anyway to Authenticate a user using Google Apps in an Android application?

y el puesto artículo de blog: http://javagwt.blogspot.com/2009/12/authenticating-android-app-to-google.html

Recuerde, la diferencia ahora es que Google tiene la autenticación de dos pasos ahora lo que podría tener a modificar algunos pasos.

+0

He leído esto ya ...para ser más específico, entiendo cómo hacerlo con el mecanismo OAuth, que es una buena forma de autenticarse con otros servicios como Twitter, pero las cuentas de google ya son compatibles con el teléfono Android, y quiero omitir ese paso donde el usuario debe ingresar sus credenciales y salir solo confirmación de que mi aplicación usará su cuenta para recuperar datos ... qué más ... Planeo recuperar datos no del motor de la aplicación sino de las tareas de google – endryha

3

Puede utilizar la estructura en AccountManager:

Account[] accounts = accountManager.getAccountsByType("com.google"); 

luego extraer la cuenta que desee de la lista devuelta. El siguiente paso sería llamar al AccountManager.getAuthToken.

vez que tenga el token de autenticación, puede transmitirlo a las API de Google llamando al:

api.setUserToken(token); 

en contraposición a los SetUserCredentials que requieren que el usuario y la contraseña.

8

sí, puede acceder a la información en el accountManager y autenticar al usuario que utiliza la cuenta de google registrada (por ejemplo) sin que ella ingrese la contraseña.

el código de abajo es una mezcla funcional y combinar a partir de ejemplos de nick johnson y por tencent

comienzo con su actividad principal:

package com.tg.auth; 

import android.accounts.Account; 
import android.accounts.AccountManager; 
import android.app.ListActivity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class ZAuth02aActivity extends ListActivity { 
    protected AccountManager accountManager; 
    protected Intent intent; 
    String TAG = "TGtracker"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     accountManager = AccountManager.get(getApplicationContext()); 
     Account[] accounts = accountManager.getAccountsByType("com.google"); 
     this.setListAdapter(new ArrayAdapter<Account>(this, R.layout.list_item, accounts));   

    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     Account account = (Account)getListView().getItemAtPosition(position); 
     Intent intent = new Intent(this, AppInfo.class); 
     intent.putExtra("account", account); 
     startActivity(intent); 
    } 
} 

crear una clase AppInfo:

package com.tg.auth; 


import org.apache.http.impl.client.DefaultHttpClient; 

import android.accounts.Account; 
import android.accounts.AccountManager; 
import android.accounts.AccountManagerFuture; 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

public class AppInfo extends Activity { 
    DefaultHttpClient http_client = new DefaultHttpClient(); 
    Activity activity; 
    String TAG = "TGtracker"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.app_info); 
     activity = this; 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     //Log.v(TAG, "resuming activity"); 
     AccountManager accountManager = AccountManager.get(getApplicationContext()); 
     //if result is null, you might not have a valid internet connection 
     Log.i(TAG, "got token, yipee: "+updateToken(accountManager, true)); 
    } 


    private String updateToken(AccountManager am, boolean invalidateToken) { 
     String authToken = "null"; 
     try { 
      Account[] accounts = am.getAccountsByType("com.google"); 
      AccountManagerFuture<Bundle> accountManagerFuture; 
      if(activity == null){//this is used when calling from an interval thread 
       accountManagerFuture = am.getAuthToken(accounts[0], "android", false, null, null); 
      } else { 
       accountManagerFuture = am.getAuthToken(accounts[0], "android", null, activity, null, null); 
      } 
      Bundle authTokenBundle = accountManagerFuture.getResult(); 
      authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN).toString(); 
      Log.v(TAG, "newToken preinvalidate: "+authToken); 

      if(invalidateToken) { 
       am.invalidateAuthToken("com.google", authToken); 
       authToken = updateToken(am, false); 

      } 
     } catch (IOException e) { 
      Log.e(TAG, "the exception was: "+e.toString()); 
      e.printStackTrace(); 
     } 
     return authToken; 
    } 
} 

uso un archivo de manifiesto, algo como esto (debe declarar actividades + permisos):

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.tg.auth" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="7" /> 
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"></uses-permission> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS"></uses-permission> 
    <uses-permission android:name="android.permission.USE_CREDENTIALS"></uses-permission> 
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".ZAuth02aActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".AppInfo"></activity> 
    </application> 

</manifest> 

utilización archivos de diseño de Nick Johnson que se puede descargar here

+0

Cuando intento esto, aparece un error que getResult() no puede se ejecutará en el hilo principal de esta línea: Bundle authTokenBundle = accountManagerFuture.getResult(); Estoy trabajando en averiguar por qué y cómo resolver esto. –

0

Comprobar el proyecto de ejemplo "auth" en el SDK de Android, que hace exactamente eso.

Cuestiones relacionadas