2010-11-17 14 views
9

Chcę zapytać, jaki jest najlepszy sposób uwierzytelnienia użytkownika za pomocą jego konta Google już skonfigurowanego w telefonie. Najpierw zajrzałem do ClientLogin, ale to nie jest to, czego chcę, ponieważ wymaga od użytkowników wprowadzenia loginu/hasła w mojej aplikacji. Mogę to zrobić za pomocą OAuth, ale tam powinienem poprosić użytkownika o podanie swoich danych uwierzytelniających w przeglądarce, co nie jest również korzystne. Chcę używać AccountManager (zauważyłem, że zawiera on metodę getPassword dla konkretnego konta, ale nie zadziałało to dla mnie), jeśli możliwe jest użycie jakoś AccountManager + ClientLogin lub AccountManager + OAuth, proszę mi powiedzieć. W rezultacie chcę mieć możliwości logowania się do konta użytkownika Google bez pytania o jego login/hasło (z potwierdzeniem na urządzeniu z Androidem oczywiście). Nie jestem pewien, czy jest to możliwe, ale jeśli istnieje jakiś sposób na jego wdrożenie, proszę wskazać mi, jak to zrobić. ..Android: uwierzytelnianie Google

+0

byłoby miło, gdybyś głosował na poprawną odpowiedź na swoje pytanie. lub, jeśli nikt nie odpowiada twoim potrzebom, skomentował je. sprawia, że ​​my, respondenci (skomentowałeś w tym czasie) czujemy się docenieni za nasze wysiłki, aby ci pomóc. :) –

Odpowiedz

0

od a stackoverflow pytanie w feb2010: Anyway to Authenticate a user using Google Apps in an Android application?

i postu blogu: http://javagwt.blogspot.com/2009/12/authenticating-android-app-to-google.html

Pamiętaj, że różnica jest teraz, że Google robi uwierzytelnianie dwuetapowe teraz więc może trzeba zmodyfikuj niektóre kroki.

+0

Przeczytałem to już ...dokładniej rozumiem, jak to zrobić za pomocą mechanizmu OAuth, który jest dobrym sposobem uwierzytelnienia się z innymi usługami, takimi jak twitter, ale kontami Google już obsługiwanymi w telefonie z Androidem, i chcę anulować ten krok, w którym użytkownik powinien wprowadzić swoje dane uwierzytelniające i odejść tylko potwierdzenie, że moja aplikacja użyje jego konta do pobrania danych ... co jeszcze ... Planuję odzyskać dane nie z silnika aplikacji, ale z zadań Google – endryha

3

Możesz skorzystać z wbudowanych w AccountManager:

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

Następnie wyciąg z konta, które chcesz od zwracanej listy. Następnym krokiem będzie wywołanie AccountManager.getAuthToken.

Gdy masz authToken, można przekazać je do API Google pod numerem:

api.setUserToken(token); 

w przeciwieństwie do setUserCredentials, które wymagają od użytkownika i hasło.

8

Tak, można uzyskać dostęp do informacji w accountManager i uwierzytelnić użytkownika za pomocą zarejestrowanego konta Google (na przykład) bez jej wprowadzenia hasła.

poniższy kod jest funkcjonalnie mieszać i łączyć z przykładów przez nick johnson i tencent

początek swojej głównej działalności:

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

stworzyć klasę 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; 
    } 
} 

korzystania plik manifestu, w pewnym sensie (musi zadeklarować aktywności + uprawnienia):

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

użycie plików layout Nick Johnson, że można pobrać here

+0

Kiedy próbuję tego, pojawia się błąd, że getResult() nie może uruchom na głównym wątku z tej linii: Bundle authTokenBundle = accountManagerFuture.getResult(); Pracuję nad ustaleniem, dlaczego i jak rozwiązać ten problem. –

0

Sprawdź "auth" przykładowy projekt w Android SDK, robi dokładnie to.

Powiązane problemy