2012-05-12 15 views
5

Desidero ottenere un Authtoken di Google dall'accountManager che posso inviare al mio Webservice (non ospitato su App Engine) per autenticare l'utente (ho solo bisogno dell'indirizzo email e infine del suo nome, se non è richiesta alcuna autorizzazione per questo).Ottenere un token di autenticazione google di base da AccountManager

Cosa devo utilizzare per il parametro "authTokenType" del metodo "getAuthToken"?

E quale google Api devo utilizzare per ottenere l'email degli utenti?

+0

appena trovato un'altra risposta su Stackoverflow che sembra adatta: http://stackoverflow.com/a/6680837 –

risposta

4

Questo è fattibile usando OpenID Connect, ma è una sorta di sperimentazione, in modo da dettagli potrebbero cambiare in futuro. Se ottieni un token OAuth per l'ambito "https://www.googleapis.com/auth/userinfo.email" o "https://www.googleapis.com/auth/userinfo.profile" puoi utilizzarlo per ottenere informazioni utente da https://www.googleapis.com/oauth2/v1/userinfo (inclusa la posta elettronica). Ovviamente l'utente deve autorizzarlo.

Si dovrebbe teoricamente essere in grado di ottenere il token da AcccountManager utilizzando "oauth2: https: //www.googleapis.com/auth/userinfo.profile" come tipo di token, ma non sembra funzionare su il mio dispositivo (Galaxy Nexus con magazzino 4.0.4). Dal momento che ottenere un token tramite il AccountManager non funziona (almeno per ora), l'unico modo affidabile è utilizzare una WebView e ottenerne una tramite il browser come descritto qui: https://developers.google.com/accounts/docs/MobileApps

C'è una demo web app qui che esegue ciò: https://oauthssodemo.appspot.com

(in ritardo) Aggiornamento: Google Play Services è stato rilasciato ed è il modo preferito per ottenere un token OAuth. Dovrebbe essere disponibile su tutti i dispositivi con Android 2.2 e versioni successive. Ottenere un token profilo funziona con esso, infatti lo usano nell'app demo

+0

C'è un alias che posso utilizzare per https://www.googleapis.com/auth/userinfo.email o https://www.googleapis.com/auth/userinfo.profile (altrimenti questo URL verrà mostrato nell'autorizzazione richiesta che non penso sia molto user-friendly)? –

+0

Nessuno che io sappia. Sei riuscito a ottenere un token? Come ho detto, non sembra funzionare, almeno sul mio dispositivo. –

+0

Ok grazie per l'informazione, molto interessante. Ho bisogno di una soluzione che funzioni su tutti i dispositivi, quindi questo approccio non ha senso per il. L'unica soluzione possibile che mi viene in mente in questo momento è ottenere un token del motore di app e disporre di un back-end del motore di app aggiuntivo che offrirà solo un servizio di autenticazione. Non mi piace davvero questo approccio però. –

0

È possibile ottenere il nome dell'utente con l'API Google+ People. (Non fornirà l'indirizzo email dell'utente).

Se questo è OK, è possibile utilizzare "Sapere chi sei su Google" come authTokenType.

Esiste un'applicazione di esempio fornita da Google che dimostra come utilizzare AndroidAccountManager in combinazione con le API di Google+.

Link: http://code.google.com/p/google-plus-java-starter/source/browse/#hg%2Fandroid

+0

Grazie, ma ho bisogno di un token che posso utilizzare per ottenere l'email dell'utente, poiché è così che il backend sta identificando gli utenti. –

2

Ho avuto anche problemi con questo, dal momento che non ero in grado di trovare nulla come un riferimento. Forse questo può aiutare (codice copiato da un esempio di Android utilizzando l'account manager):

  1. Da qualche parte in un gestore di eventi della tua app Android, emettere una richiesta di un token di autenticazione per ottenere l'indirizzo di posta elettronica dell'utente in Android:

    _accountMgr = AccountManager.get(this); 
    Account [] accounts = _accountMgr.getAccounts();     
    Account account = accounts[0]; // For me this is Google, still need to figure out how to get it by name. 
    _accountMgr.getAuthToken(account, AUTH_TOKEN_TYPE, false, new GetAuthTokenCallback(), null); 
    
  2. Nel callback, estrarre il token di accesso:

    private class GetAuthTokenCallback implements AccountManagerCallback<Bundle> { 
        public void run(AccountManagerFuture<Bundle> result) { 
         Bundle bundle; 
         try { 
          bundle = result.getResult(); 
          final String access_token = bundle.getString(AccountManager.KEY_AUTHTOKEN); 
          // store token somewhere you can supply it to your web server. 
         } catch (Exception e) { 
          // do something here. 
         } 
        } 
    } 
    
  3. fare qualche richiesta al server web, fornendo l'acc token.

  4. sul server Web, convalidare il token di accesso e ottenere l'indirizzo e-mail:

    curl -d 'access_token=<this is the token the app sent you>' https://www.googleapis.com/oauth2/v1/tokeninfo 
    

    si dovrebbe ottenere qualcosa di simile:

    { 
        "issued_to": "<something>.apps.googleusercontent.com", 
        "audience": "<something>.apps.googleusercontent.com", 
        "scope": "https://www.googleapis.com/auth/userinfo.email", 
        "expires_in": 3562, 
        "email": "<users email address>", 
        "verified_email": true, 
        "access_type": "online" 
    } 
    

    o se qualcosa è andato storto:

    { 
        "error": "invalid_token", 
        "error_description": "Bad Request" 
    } 
    
Problemi correlati