2010-11-17 24 views
9

Je veux demander, quelle est la meilleure façon d'authentifier l'utilisateur avec son compte Google déjà configuré sur le téléphone. J'ai d'abord regardé le ClientLogin, mais ce n'est pas ce que je veux car cela nécessite que les utilisateurs entrent le login/mot de passe dans mon application. Je peux le faire avec OAuth mais là je devrais demander à l'utilisateur d'entrer ses informations d'identification dans le navigateur ce qui n'est pas préférable aussi. Je veux utiliser AccountManager (J'ai remarqué qu'il contient la méthode getPassword pour un compte particulier mais cela n'a pas fonctionné pour moi), s'il est possible d'utiliser AccountManager + ClientLogin ou AccountManager + OAuth de façon ou d'autre. En résultat je veux avoir des possibilités de se connecter avec un compte utilisateur Google sans demander son identifiant/mot de passe (avec confirmation sur l'appareil Android bien sûr) je ne suis pas sûr que ce soit possible mais s'il existe un moyen de le mettre en oeuvre ..Android: authentification Google

+0

serait bien si vous avez voté pour une réponse correcte à votre question. ou, au cas où aucun ne répond à vos besoins, les a commentés. fait de nous, répondeurs (vous avez commenté un à la fois) se sentir apprécié pour nos efforts pour vous aider. :) –

Répondre

0

d'une stackoverflow question Feb2010: Anyway to Authenticate a user using Google Apps in an Android application?

et le blog de l'article: http://javagwt.blogspot.com/2009/12/authenticating-android-app-to-google.html

Rappelez-vous, la différence est maintenant que Google fait l'authentification en deux étapes maintenant de sorte que vous pourriez avoir à modifier certaines étapes.

+0

J'ai déjà lu ceci ...Pour être plus précis, je comprends comment le faire avec le mécanisme OAuth qui est un bon moyen de s'authentifier avec d'autres services comme un twitter, mais les comptes google déjà supportés dans Android Phone, et je veux ommiter cette étape où l'utilisateur doit entrer ses identifiants et partir juste la confirmation que mon application va utiliser son compte pour récupérer des données ... quoi d'autre ... Je prévois d'extraire des données non du moteur de l'application, mais des tâches google – endryha

3

Vous pouvez utiliser la construction dans AccountManager:

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

extrait ensuite le compte que vous voulez de la liste renvoyée. La prochaine étape serait d'appeler AccountManager.getAuthToken.

Une fois que vous avez la authToken, vous pouvez le transmettre aux API Google en appelant:

api.setUserToken(token); 

par opposition aux SetUserCredentials qui nécessitent l'utilisateur et mot de passe.

8

Oui, vous pouvez accéder aux informations dans le gestionnaire de compte et authentifier l'utilisateur en utilisant un compte google enregistré (par exemple) sans entrer son mot de passe.

le code ci-dessous est un mélange fonctionnel et correspondance à partir d'exemples par nick johnson et par tencent

début avec votre activité principale:

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); 
    } 
} 

créer une classe 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; 
    } 
} 

utilisation un fichier manifeste, un peu comme ceci (doit déclarer les activités + permissions):

<?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> 

utilisation des fichiers de mise en page de nick johnson que vous pouvez télécharger here

+0

Lorsque j'essaie cela, j'obtiens une erreur que getResult() ne peut pas être exécuté sur le thread principal à partir de cette ligne: Bundle authTokenBundle = accountManagerFuture.getResult(); Je travaille à comprendre pourquoi et comment résoudre ce problème. –

0

Vérifiez l'exemple de projet « auth » dans le SDK Android, il fait exactement cela.