Credenciales del servicio web – 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 bash de algo así y he estado leyendo sobre OpenID y la biblioteca Android AccountManager.

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

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

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

Así que optamos por utilizar OpenID, que lamentablemente es un estándar web y no funciona bien con dispositivos móviles, pero es factible.

En el lado de 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, le presentamos una lista de los autenticadores OpenID (Google, Yahoo, etc.). Luego, abrimos un navegador nativo (no el navegador integrado) y enviamos al usuario al sitio de autenticación de OpenID elegido. La ventaja es que el navegador del usuario generalmente ya tiene el nombre de usuario / contraseña recordado, por lo que este paso solo requiere que el usuario presione un botón.

Esto es bastante sencillo. Ahora, aquí está la parte difícil: después de que el usuario confirma el inicio de sesión, OpenID redirecciona a nuestra URL de devolución de GAE (debe proporcionar esta url cuando se solicite). En esta url creamos una URL personalizada, por ejemplo:

yourappname://usrname#XXXYYYZZZ 

donde XXXYYYZZZZ es auth token. Obtenemos este token de la página de devolución donde se almacena como una cookie de 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 URL de yourappname:// , de modo que cuando el usuario haga clic en este enlace, nuestra aplicación se invoca y se le pasa el enlace. Extraemos el nombre de usuario y el token de este enlace y lo usamos en solicitudes de REST para el backend de GAE.

Si tienes más preguntas, con gusto actualizaría esta publicación.

Actualizar:

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

Pasé aproximadamente una semana para encontrar una forma adecuada y moderna para esto, sin navegador web y usando el administrador de cuentas de Android.

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

  1. Obtenga su token en Contactos de Google (el tipo de token de autenticación es “cp”) a través de AccountManager en el hilo de fondo :

     public String getUserToken(Activity activity) { AccountManager accountManager = AccountManager.get(activity); AccountManagerFuture 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. Pass recibió UserToken en el servidor a través de un canal seguro .

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

     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 (por lo general, después de una hora), por lo que si no puede validar el token en el servidor, debe enviar una respuesta al cliente, invalidar el token y obtener uno nuevo. Use el administrador de cuenta para invalidar el token:

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

Creo que esta publicación 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 estaba preguntando el autor de la pregunta.

Básicamente, solo está obteniendo un authToken utilizando el ámbito “ah” y pasándolo a la página web correcta para obtener la cookie ACSID que le permitirá acceder a cualquier página de App Engine que use UserService para la autenticación.

    Intereting Posts