2012-05-12 22 views
5

Quiero obtener un Google Authtoken del AccountManager que puedo enviar a mi servicio web (no alojado en App Engine) para autenticar al usuario (solo necesito la dirección de correo electrónico y eventualmente su nombre, si no se requiere permiso para esto).Obteniendo una autenticación de google básica de AccountManager

¿Qué debo usar para el parámetro "authTokenType" del método "getAuthToken"?

¿Y qué API de Google tengo que usar para obtener el correo electrónico de los usuarios?

+0

encontrados otra respuesta sobre Stackoverflow que parece adecuada: http://stackoverflow.com/a/6680837 –

Respuesta

4

Esto es factible usando OpenID Connect, sin embargo, es una especie de experimentación, así que los detalles podrían cambiar en el futuro. Si obtiene un token de OAuth para el alcance 'https://www.googleapis.com/auth/userinfo.email' o 'https://www.googleapis.com/auth/userinfo.profile', puede usarlo para obtener información del usuario de https://www.googleapis.com/oauth2/v1/userinfo (incluido el correo electrónico). Por supuesto, el usuario necesita autorizar esto.

En teoría, debería poder obtener el token de AcccountManager utilizando el "oauth2: https: //www.googleapis.com/auth/userinfo.profile" como el tipo de token, pero parece que no funciona en mi dispositivo (Galaxy Nexus con stock 4.0.4). Como obtener un token a través del AccountManager no funciona (al menos por ahora), la única forma confiable es usar un WebView y obtener uno a través del navegador como se describe aquí: https://developers.google.com/accounts/docs/MobileApps

Aquí hay una aplicación de demostración que hace esto: https://oauthssodemo.appspot.com

(tarde) Actualización: Google Play Services ha sido lanzado y es la forma preferida de obtener un token de OAuth. Debería estar disponible en todos los dispositivos con Android 2.2 y versiones posteriores. Obtener un token de perfil funciona con él, de hecho lo usan en la aplicación de demostración

+0

¿Hay un alias que pueda usar para https://www.googleapis.com/auth/userinfo.email o https://www.googleapis.com/auth/userinfo.profile (de lo contrario, esta URL se mostrará en el permiso solicitud que no creo que sea muy amigable para el usuario) –

+0

Ninguna que yo sepa. ¿Has logrado obtener una ficha? Como dije, parece que no funciona, al menos en mi dispositivo. –

+0

Ok gracias por la información, muy interesante. Necesito una solución que funcione en todos los dispositivos, por lo que este enfoque no tiene sentido para el. La única solución posible en la que puedo pensar ahora es obtener un token de motor de aplicación y tener un backend de motor de aplicación adicional que solo ofrecerá un servicio de autenticación. Aunque realmente no me gusta este enfoque. –

0

Puede obtener el nombre del usuario con la API de personas de Google+. (No proporcionará la dirección de correo electrónico del usuario).

Si esto está bien, puede usar "saber quién es usted en Google" como authTokenType.

Hay una aplicación de ejemplo proporcionada por Google que muestra cómo usar el AndroidAccountManager junto con las API de Google+.

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

+0

Gracias, pero necesito un token que pueda usar para obtener el correo electrónico del usuario, ya que esa es la forma en que el backend identifica a los usuarios. –

2

También he tenido problemas con esto, ya que no pude encontrar nada como una referencia. Tal vez esto le puede ayudar (código copiado de un ejemplo de Android sobre el uso del gestor de cuenta):

  1. En algún lugar de un controlador de eventos de la aplicación de Android, emitir una solicitud de token de autenticación para obtener la dirección de correo electrónico del usuario en 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. En la devolución de llamada, extraer el token de acceso:

    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. hacer algo de solicitud a su servidor web, el suministro de la ACC ess token

  4. en el servidor web, validar el token de acceso y obtener la dirección de correo electrónico:

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

    usted debe obtener algo como esto:

    { 
        "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 si algo ha ido mal:

    { 
        "error": "invalid_token", 
        "error_description": "Bad Request" 
    } 
    
Cuestiones relacionadas