2012-05-11 17 views
7

Sto scrivendo un app Android che parla a un server remoto, e voglio consentire agli utenti di app per accedere al server utilizzando le credenziali di Google che risiedono sul loro telefono cellulare, cioè senza richiedere l'utente per inserire la propria password di google in qualsiasi punto della mia app. Ad esempio, se il telefono (Android) dell'utente è stato configurato con "[email protected]", e quindi installano ed eseguono la mia app, la mia app presenterà una finestra di dialogo che dice "Vuoi accedere come qualcosa del genere @ gmail.com? ", e dopo aver premuto un pulsante Ok avrebbero stabilito un ID sul mio server che sa che il loro indirizzo email è [email protected], come certificato da Google stesso.autorizzazione account Google all'interno di un'applicazione Android

Ho trovato ricette parziali diffuse e varie su come procedere, compresa la documentazione di oauth2 di google, ma non ho mai indugiato su come realizzare tutto questo.

io ho il codice di Android che utilizza l'AccountManager per capire quali account Google sono su un determinato telefono. Chiedo all'utente quale account google vorrebbe utilizzare per accedere e quindi restituisco un token di autorizzazione.

Passato quel punto, sto praticamente facendo girare le mie ruote. Le ricette che ho guardato sembrano chiamare per il mio facendo un HTTP GET di questa forma:

http://<myWebServer>.com/_ah/login?continue=<someUrlIChoose>&auth=<authToken> 

... che (a) è insoddisfacente, in quanto sembra essere specifico per AppEngine e voglio la libertà per eseguire questo su qualsiasi back-end di mia scelta, e (b) anche sperimentando con appengine, l'istanza appengine che ho impostato non sembra essere affatto segnalata, cioè i registri mostrano ora le query ad esso (speravo l'URL di someUrlIChoose sarebbe stato chiamato con qualcosa) ... quindi nessuna opportunità di essere informati della validità del token.

Domande specifiche includerebbero:

  • Cosa devo fare con il token di autenticazione ... posso inviare al mio server e hanno in qualche modo il mio contatto server di Google per verificare la validità del token di per la account specificato? O c'è qualche backchannel comunicazione che dovrebbe avere già (in questa fase del processo ) originati dai server di Google per informare il mio server che questo token è valido (e se sì, come faccio a impostare che fino)? O qualcosa del genere ?
  • ho ragione a supporre che questo processo dovrebbe essere fattibile nel contesto di qualsiasi back-end (non solo appengine)?
  • È oauth2 cosa dovrei usare (al contrario di oauth1, o qualcosa di )? Tutto ciò che ho letto sembra implicare che il supporto di google per oauth2 sia "sperimentale" ... ma non ho verificato se tali asserzioni siano attuali o obsolete; e anche se attuale, Google ha una cronologia di di mantenere vari prodotti in forma non definitiva permanente (ad esempio, beta eterno), quindi non so cosa concludere a riguardo.
  • Tutto il resto che è rilevante ...

risposta

0

'questo quello che sono interessato di?

La maggior parte delle app Android ha una sorta di back-end lato server, per mantenere e condividere i dati. Anche il gioco più basilare deve ricordare i punteggi più alti dei suoi giocatori.Quando stai costruendo il tuo back-end, un problema da risolvere è il modo in cui il codice back-end sa quale app sta parlando a e chi è la persona che lo usa.

Probabilmente hai endpoint HTTP per comunicare con il tuo client app, ma come può il codice lato server essere sicuro di chi sta inviando i messaggi ad esso? Dopo tutto, chiunque può inviare richieste HTTP POST da qualsiasi luogo; potrebbero impersonare i tuoi utenti se potessero indovinare le loro identità ?

È davvero scortese chiedere alle persone di digitare i nomi utente e le password sui dispositivi mobili. In particolare, se qualcuno ha installato la tua app e gli ha dato il permesso di utilizzare Internet e conosce la tua identità , non dovrebbero più essere infastiditi.

Si scopre che Google Play Services, ora disponibile su tutti i dispositivi compatibili operativo Android versione 2.2 o superiore, offre una buona soluzione a questo problema, basato sull'utilizzo di Google Accounts.

http://android-developers.blogspot.se/2013/01/verifying-back-end-calls-from-android.html

2

È necessario importare google-play-services_lib dopo che è possibile utilizzare questo codice:

import com.google.android.gms.auth.GoogleAuthUtil; 
import com.google.android.gms.auth.UserRecoverableAuthException; 

private void gmail_login() { 

    dialog = ProgressDialog.show(LoginActivity.this, "", getString(R.string.login_loading), true); 

    AsyncTask task = new AsyncTask() { 
     @Override 
     protected Object doInBackground(Object... params) { 
       getAndUseAuthTokenBlocking(); 
      return null; 
     } 
    }; 
    task.execute((Void)null); 
} 


void getAndUseAuthTokenBlocking() { 
    try 
    { 
     String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/userinfo.email"; 
     AccountManager accountManager = AccountManager.get(this); 
     Account[] accounts = accountManager.getAccountsByType("com.google"); 

     String token = GoogleAuthUtil.getToken(this, accounts[0].name, AUTH_TOKEN_TYPE); 
     //token here 
    } 
    catch (UserRecoverableAuthException userAuthEx) { 
     startActivityForResult(userAuthEx.getIntent(), MY_ACTIVITYS_AUTH_REQUEST_CODE); 
    }catch (Exception e){ 
     DropErrorMsg.drop(this, handler, R.string.connection_error, R.string.error, dialog, false); 
    } 
} 
Problemi correlati