Credenciales de Webservice – OpenID / Android AccountManager?

Estoy construyendo un servicio web y me gustaría usar las credenciales de la cuenta de google del usuario.

El servicio se ejecuta en GAE y tendrá un cliente web y un cliente nativo de Android.

Este es mi primer intento de algo como esto y he estado leyendo sobre OpenID y la biblioteca de AccountManager de Android.

Todavía no estoy seguro de cuáles son mis opciones en términos de almacenamiento de los usuarios en mi almacén de datos. ¿Qué identificador debo utilizar? ¿Es posible usar OpenID en una aplicación nativa de Android?

Cualquier ayuda y / o punteros serían apreciados. Gracias.

Tuvimos requisitos similares en el último proyecto: backend GAE con frontend GWT y clientes de Android / iPhone. Además, no queríamos almacenar credenciales de usuario.

Así que optamos por usar OpenID, que es por desgracia un estándar web y no juega bien con los dispositivos móviles, pero es factible.

En el lado GAE simplemente habilitamos el inicio de sesión federado que nos dio OpenID.

En los dispositivos móviles, cuando el usuario necesita iniciar sesión les presentamos una lista de autentificadores OpenID (Google, Yahoo, etc.). A continuación, abrimos un navegador nativo (no navegador integrado) y el usuario directo al sitio de autenticación OpenID elegido. La ventaja es que el navegador del usuario por lo general ya tiene nombre de usuario / pase recordado, por lo que este paso sólo requiere que el usuario presione un botón.

Todo esto es bastante sencillo. Ahora aquí está la parte difícil: Después de que el usuario confirme el inicio de sesión, OpenID redirecciona de nuevo a nuestro url de retorno GAE (necesita proporcionar esta url cuando se solicita). En esta url creamos una URL personalizada, por ejemplo:

yourappname://usrname#XXXYYYZZZ 

Donde XXXYYYZZZZ es token de autenticación. Obtenemos este token de la página de retorno donde se almacena como una cookie ACSID: usamos algunos JSP para leer esta cookie y envolverla en la URL personalizada anterior.

Luego registramos nuestras aplicaciones de Android y iPhone para manejar las URLs de yourappname:// , de modo que cuando el usuario cliskc este enlace, nuestra aplicación sea invocada y el enlace sea pasado a ella. Extraemos el nombre de usuario y el token de este enlace y lo usamos en las peticiones REST al backend GAE.

Si tiene más preguntas, me gustaría actualizar esta publicación.

Actualizar:

La cookie de sesión de usuario en AppEngine de producción se denomina ACSID , mientras que en el servidor AppEngine de desarrollo se denomina dev_appserver_login .

Pasé aproximadamente una semana para encontrar una manera conveniente y moderna de mirar para esto – sin el web browser y usando el encargado de cuenta de androide.

Si desea utilizar la cuenta de Google y AccountManager para identificar al usuario, puede:

  1. Obtener su token a los contactos de Google (el tipo de token de autorización es "cp") a través de AccountManager en el subproceso de fondo :

     public String getUserToken(Activity activity) { AccountManager accountManager = AccountManager.get(activity); AccountManagerFuture<Bundle> amf = accountManager.getAuthTokenByFeatures("com.google", "cp", null, activity, Bundle.EMPTY, Bundle.EMPTY, null, null ); Bundle bundle = null; try { bundle = amf.getResult(); String name = (String) bundle.get(AccountManager.KEY_ACCOUNT_NAME); String type = (String) bundle.get(AccountManager.KEY_ACCOUNT_TYPE); String token = bundle.getString(AccountManager.KEY_AUTHTOKEN); return token; } catch (OperationCanceledException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (AuthenticatorException e) { e.printStackTrace(); } return null; } 
  2. Pase recibido UserToken al servidor a través de canal seguro .

  3. Validar el token en el servidor mediante google usando la biblioteca de gdata (biblioteca de Google Data API ):

     public String getUserId(String token) { ContactsService contactsService = new ContactsService("Taxi"); contactsService.setUserToken(token); IFeed feed = null; try { feed = contactsService.getFeed(new URL("https://www.google.com/m8/feeds/contacts/default/full?max-results=10000"), ContactFeed.class); } catch (IOException e) { e.printStackTrace(); } catch (ServiceException e) { e.printStackTrace(); } catch (NullPointerException e) { e.printStackTrace(); } if (feed == null) return null; String externalId = feed.getId(); IPerson person = feed.getAuthors().get(0); String email = person.getEmail(); String name = person.getName(); String nameLang = person.getNameLang(); return externalId; } 
  4. El token de Google puede caducar (generalmente después de una hora), por lo que si no se valida el token en el servidor, debe enviar la respuesta al cliente, invalidar el token y obtener uno nuevo. Utilice el administrador de cuentas para invalidar el token:

     public void invalidateUserToken(Context context, String token) { AccountManager accountManager = AccountManager.get(context); accountManager.invalidateAuthToken("com.google", token); } 

Creo que este post de blog hace exactamente lo que quieres. Funcionó para mí. Ambas soluciones publicadas aquí son viables e inteligentes, pero creo que esto es exactamente lo que el asker estaba preguntando.

Esencialmente, sólo obtiene un authToken usando el alcance "ah" y lo pasa a la página web correcta para obtener la cookie de ACSID que le permitirá acceder a cualquier página de AppEngine que utilice UserService para la autenticación.

http://developer.android.com/search.html#q=AccountManager&t=0

http://developer.android.com/resources/samples/SampleSyncAdapter/index.html en la parte inferior de esta página encontrarás todo el código necesario

atentamente

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.