En este post voy a escribir sobre una importante novedad en Couchbase Móvil versión 1.3, OpenID Connect (OIDC).

OpenID Connect Logo

Introducción

Couchbase Mobile tiene una serie de importantes características de seguridad. Sync Gateway actúa como intermediario que permite a Couchbase Lite replicar datos a Couchbase Server. Naturalmente, muchas aplicaciones quieren autenticar a los usuarios y controlar lo que pueden hacer a través de Sync Gateway. OpenID Connect ofrece una opción que simultáneamente simplifica la adición de autenticación, da a los desarrolladores un gran paso adelante en las opciones de integración, y elimina el dolor de cabeza de apoyo a la infraestructura necesaria.

El objetivo

Permítanme aclarar un poco. En un escenario típico, una aplicación utiliza Couchbase Lite como su almacén de datos primario. La información se lee y se escribe en la base de datos local. La aplicación configura la replicación a un servidor backend a través de una instancia de Sync Gateway que se ejecuta en la nube.

A menudo, como desarrollador de aplicaciones, desea vincular los datos a una identidad única y verificable. Los detalles de la identidad no importan realmente. Gestionar la infraestructura se convierte en una sobrecarga innecesaria. OpenID Connect proporciona la forma de descargar esto a otras fuentes de confianza.

Vamos a detallar todos los actores. Tenemos el usuario, la aplicación, Couchbase Lite (integrado en la aplicación), nuestra instancia de Sync Gateway, y OpendID Provider (OP).

Sync Gateway controla la autorización de cualquier cambio durante la replicación. El objetivo es que el usuario inicie sesión en la aplicación autenticándose ante el operador. El OP proporciona información de vuelta la aplicación puede utilizar para proporcionar Sync Gateway prueba de la identidad del usuario. Vamos a caminar a través de todos los pasos para esto.

Conectar OpendID

Ya existen muchos servicios que exigen a los usuarios crear una cuenta, etc. El sitio Fundación OpenID con el fin de crear normas que permitan abrir las partes de autenticación de estos sistemas al uso externo. Este esfuerzo dio lugar a la especificación OpenID Connect. En palabras de la OpenID Foundation:

OpenID Connect es un protocolo de autenticación interoperable basado en la familia de especificaciones OAuth 2.0. Utiliza flujos de mensajes REST/JSON sencillos con el objetivo de "simplificar lo sencillo y hacer posible lo complicado". Es excepcionalmente fácil de integrar para los desarrolladores, en comparación con cualquier protocolo de identidad anterior.

Para saber más sobre OpenID Connect, puedes echar un vistazo a los enlaces anteriores. También he encontrado este escrito valioso.

Flujos

OpenID Connect sigue tres posibles "flujos". Un flujo especifica las etapas de ida y vuelta del protocolo, y todos los detalles de qué parámetros son necesarios y qué significan. Aquí hablaremos del flujo de código de autorización (flujo auth). El flujo auth configura las capacidades de refresco, así que si no quieres molestar a un usuario para que se registre demasiado a menudo, es el que debes usar.

Couchbase ha implementado clases para abstraer gran parte de la complejidad de OpendID Connect. Como otras partes de Couchbase Lite, las clases de autenticación manejan mucho entre bastidores, especialmente las llamadas a la red.

Aun así, un ejemplo de código completo es demasiado para una entrada de blog. Proporcionaré ejemplos simplificados. Para ver una aplicación completa, echa un vistazo a los proyectos GrocerySync en couchbaselabs en Github. Aquí están los enlaces para Android y iOS. (Tenga en cuenta que a partir de este escrito es necesario cambiar a la rama openid).

Veamos los pasos clave para implementar la autenticación en una aplicación Android. Utilizaremos Google como proveedor de OpenID (OP).

En Android, se puede implementar algo directamente, utilizar la función Inicio de sesión en Google o utilizar las envolturas integradas en Couchbase Lite. Nosotros usaremos las envolturas de Couchbase Lite. Para entender mejor el código subyacente, puedes consultar la documentación de Google sobre la implementación de OpenID Connect. Puedes encontrarla en aquí.

Replicación

En Couchbase, nos referimos a la sincronización de los cambios de la base de datos como replicación. No sorprende entonces que la autenticación esté profundamente ligada a la replicación. Brevemente, para sincronizar, creas objetos de replicación, estableces algunas opciones, y luego los activas, ya sea en modo único o continuo.

Normalmente, la autenticación se realiza creando un Autentificador y asignarlo a un objeto de Replicación. Couchbase Lite tiene fábricas para crear diferentes tipos de autenticadores. Puedes leer más sobre las réplicas, Replicación objetos y autentificadores aquí.

Código

En mi sencilla aplicación de ejemplo, el primer Actividad al iniciarse presenta dos botones, uno para iniciar sesión y otro para cerrarla. Me referiré a esto como la actividad principal. Si el usuario no ha iniciado sesión, al hacer clic en el botón de inicio de sesión se inicia una actividad con una vista web para gestionar el proceso de inicio de sesión. La llamaré actividad de inicio de sesión. El almacenamiento de las credenciales se realiza después de volver a la actividad principal.

El código comprende tres secciones clave, repartidas entre estas dos actividades.

Preparar una réplica

Las réplicas tienen una "dirección". Una replicación pull transfiere datos desde un Sync Gateway, mientras que una push envía datos a uno. Aquí acabo de configurar una replicación pull, para resaltar la parte de autenticación. El código está desglosado, pero se llama durante onCreate en la actividad principal.

La parte crítica, para nuestros propósitos, reside en la creación del autenticador. No dejes que la longitud de las líneas de código te engañe. Todo es muy sencillo. Puede que te ayude examinar el código de dentro a fuera.

Eche un vistazo al cuerpo del devolución de llamada método. Toma tres parámetros de entrada. Uno lo guarda para más tarde. Dos los pone en un Intención. Esa intención inicia la actividad de inicio de sesión y pide recibir un resultado.

Toda la formulación de las URLs de la forma en que OpenID las necesita se ha hecho por ti. Por ejemplo, cuando comprobé la URL de inicio de sesión, ¡tenía más de 400 caracteres con lo que parecían más de 15 parámetros! Habiendo implementado yo mismo un flujo OAuth 2 gestionando las llamadas de red y todo eso, puedo decir definitivamente que esto es mucho más agradable.

Más adelante veremos cómo la configuración de Sync Gateway interviene en este flujo. Por el momento, si examina las URL, sepa que Sync Gateway suministra partes en respuesta al inicio no autenticado de una replicación.

El tercer parámetro del método de devolución de llamada (el parámetro OIDCLoginContinuation ) es proporcionada por Couchbase Lite. Este es el gancho que se utiliza para devolver los resultados del registro. Lo exploraremos con más detalle en un momento.

Actividad de inicio de sesión

Como probablemente pueda adivinar, muchos proveedores de OpenID funcionan con páginas web. La actividad de inicio de sesión consiste en una vista web estándar. (El uso de una vista web tiene importantes implicaciones de seguridad. Por favor, consulte la nota especial al final sobre seguridad para más detalles). Es necesario configurar la navegación y habilitar JavaScript. Puedes leer todo sobre esto en la sección Guía Android para crear aplicaciones web. Sólo tenemos que ver en detalle la interceptación de la carga de URL. Aquí está el código.

(Nota Android Studio puede darle una advertencia acerca de shouldOverrideUrlLoading en desuso. En el momento de escribir estas líneas, esta versión sigue siendo la más extendida).

Cuando se suministra un WebViewClientAndroid lo utiliza para enganchar todas las nuevas cargas de página. OpenID codifica el resultado de un intento de autenticación en forma de URL con, una vez más, un montón de parámetros incrustados. Nuestro WebViewClient espera a detectar la URL de redirección, la empaqueta y finaliza la actividad de inicio de sesión, volviendo a nuestra actividad principal. Tal vez quieras manejar esto con una AsyncTask para añadir extras como una barra de progreso.

Para terminar

La actividad de inicio de sesión devuelve la url de respuesta a la actividad principal. Para completar el proceso de autenticación (incluyendo el almacenamiento de credenciales), Couchbase Lite proporciona su propio callback, uno que implementa el método OIDCLoginContinuation interfaz. La interfaz recibe dos argumentos, la url resultante y una excepción. Los comentarios en el fragmento de código explican la semántica de los argumentos, incluyendo cómo las combinaciones de valores nulos y no nulos indican éxito u otros resultados.

Trato los errores de forma simplista a modo de ilustración. Es probable que quieras hacer algo más sofisticado. La url de respuesta puede contener información de error si algo va mal. Usted puede utilizar eso para dar al usuario una visión más detallada de lo que falló.

Resumen del código de la aplicación

Usando las clases de Couchbase Lite, tenemos un flujo muy simple. Configuramos un autenticador y lo adjuntamos a una replicación. Iniciamos la replicación, posiblemente en respuesta a una acción del usuario (por ejemplo, haciendo clic en el botón de inicio de sesión).

El autenticador nos devuelve el control junto con tres elementos preformados, dos urls y un callback suministrado por Couchbase Lite. Procedemos con la autenticación como queramos. Y, por último, tenemos que terminar llamando al callback que hemos recibido.

Trucos y consejos

ID de usuario

No lo mostramos en el código, pero a menudo querrás asignar algún tipo de id de usuario basado en la información de la respuesta OpenID. Puedes usar el id para crear un canal de Sync Gateway para filtrar documentos, por ejemplo.

Cerrar sesión

Puede borrar las credenciales de una réplica llamando a la funciónclearAuthenticationStores método. Si ha utilizado una vista web, es posible que también desee deshacerse de las cookies de sesión. Este fragmento de código muestra cómo hacerlo con Android API 21 o posterior.

Pruebas

Puede probar su código utilizando un emulador y una instancia de Sync Gateway en el mismo equipo. Emuladores comunes como el suministrado con Android o el de Genymotion le permitirá conectarse a un servicio en su máquina utilizando una dirección IP especial. Sin embargo, el OP de Google suele rechazarlas en las urls. He utilizado un truco donde Sync Gateway especifica localhost como su dirección. A continuación, en el onActivityResultado sustituyo la dirección IP requerida por el emulador por esta línea:

Configuración de Sync Gateway

Hemos terminado con el código de la aplicación. Echemos un breve vistazo a la configuración de Sync Gateway para utilizar OIDC. Este ejemplo de configuración muestra cómo configurar GoogleAuthFlow como proveedor. Tendrá que generar su propio client_id y validation_key para la producción. Consulte la Documentación y enlaces de Google para más detalles. Más información sobre Sync Gateway y cómo configurarlo en la documentación de Couchbase. aquí.

Nota especial - Seguridad

En parte, este blog describe el uso de una vista web como parte del proceso de autenticación. Este enfoque tiene desventajas, incluyendo la posibilidad de que la aplicación pueda espiar el proceso de autenticación. Para una mayor seguridad, es posible que desee considerar el uso del navegador del sistema en su lugar. Para más detalles, recomiendo la lectura de la última versión de este Borrador de Internet del IETF. La seguridad tiende a ser un blanco móvil. Si maneja información muy delicada, tómese su tiempo para informarse sobre las mejores prácticas actuales.

Posdata

Consulte más recursos en nuestra portal para desarrolladores y síganos en Twitter @CouchbaseDev.

Puede enviar preguntas a nuestro foros. Y participamos activamente en Stack Overflow.

Puede seguirme personalmente en @HodGreeley

Autor

Publicado por Hod Greeley, Defensor del Desarrollador, Couchbase

Hod Greeley es desarrollador de Couchbase y vive en Silicon Valley. Tiene más de dos décadas de experiencia como ingeniero de software y director de ingeniería. Ha trabajado en una variedad de campos de software, incluyendo física computacional y química, seguridad informática y de redes, finanzas y móviles. Antes de unirse a Couchbase en 2016, Hod dirigió las relaciones con desarrolladores para móviles en Samsung. Hod es doctor en física química por la Universidad de Columbia.

Dejar una respuesta