2012-05-11 12 views
7

Escribo una aplicación de Android que habla con un servidor remoto, y quiero permitir que los usuarios de la aplicación inicien sesión en el servidor utilizando las credenciales de google que residen en su teléfono, es decir, sin requerir el usuario debe ingresar su contraseña de google en cualquier lugar de mi aplicación. Por ejemplo, si el teléfono del usuario (Android) se configuró con "[email protected]" y ellos luego instalan y ejecutan mi aplicación, mi aplicación les presentará un diálogo que dirá "¿Desea iniciar sesión como alguien? @ gmail.com? ", y al presionar un botón Ok habrían establecido una identificación en mi servidor que sabe que su dirección de correo electrónico es [email protected], según lo certifica el propio google.Autorización de cuenta de Google dentro de una aplicación de Android

He encontrado recetas parciales generalizadas y variadas sobre cómo hacerlo, incluida la propia documentación de oauth2 de google, pero no he adivinado cómo hacer que todo suceda.

Tengo un código de Android que utiliza el AccountManager para averiguar qué cuentas de google tienen en un teléfono determinado. Informo al usuario sobre la cuenta de Google que desean utilizar para iniciar sesión y luego obtengo un token de autorización.

Pasado ese punto, estoy haciendo girar las ruedas. Las recetas que he mirado parecen llamar para mi hacer un HTTP GET de esta forma:

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

... que es insatisfactoria en (a) que parece ser específica a AppEngine y quiero la libertad para ejecutar esto en cualquier back-end de mi elección, y (b) incluso experimentando con appengine, la instancia de appengine que configuré no parece estar señalizada en absoluto, es decir, los registros muestran ahora consultas (esperaba el url de alguna URLUsar se habría llamado con algo) ... por lo tanto, no hay oportunidades de ser informado de la validez de la ficha.

preguntas específicos incluirían:

  • ¿Qué hacer con el token de autenticación ... puedo enviar a mi servidor, y de alguna manera tienen mi google contacto con el servidor para verificar la validez del token para el cuenta especificada? ¿O hay alguna comunicación de backchannel que se supone que ya se ha originado (en esta etapa del proceso ) de los servidores de google para informar a mi servidor que este token es válido (y si es así, cómo configuro eso)? O algo más más?
  • ¿Estoy en lo cierto al suponer que este proceso debería ser factible en el contexto de cualquier componente posterior (no solo appengine)?
  • ¿Es oauth2 lo que debería estar usando (en lugar de oauth1, o algo else)? Todo lo que leo parece implicar que el soporte de google para oauth2 es "experimental" ... pero no he averiguado si tales aserciones son actuales o viejas; e incluso si es actual, google tiene un historial de manteniendo varios productos en forma permanente no final (por ejemplo, eterna beta), así que no sé qué concluir sobre esto.
  • Cualquier otra cosa que es relevante ...

Respuesta

0

Es esto lo que está Loooking para?

La mayoría de las aplicaciones de Android tienen algún tipo de servidor back-end, para persistir y compartir datos. Incluso el juego más básico necesita recordar los puntajes más altos de los jugadores de .Cuando construyes tu back-end, un problema que tienes que resolver es cómo el código de back-end sabe a qué aplicación habla y quién es la persona que lo usa.

Es probable que tenga puntos finales HTTP para comunicarse con su cliente aplicaciones, pero ¿cómo puede el código del lado del servidor estar seguro de quién está enviando mensajes a él? Después de todo, cualquiera puede enviar solicitudes HTTP POST desde cualquier lugar; ¿podrían suplantar a sus usuarios si pudieran adivinar sus identidades ?

Es realmente desagradable para el usuario pedirle a las personas que escriban nombres de usuario y contraseñas en dispositivos móviles. En particular, si alguien ha instalado su aplicación y le ha dado permiso para usar Internet y conocer su identidad , ya no se le debe molestar.

Resulta que los servicios de Google Play, ahora disponibles en todos los dispositivos compatibles con Android versión 2.2 o superior, ofrece una buena solución a este problema, basado en el uso de Cuentas de Google.

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

2

Debe importar google-play-services_lib después de que se puede utilizar este código:

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