Durante los últimos meses he estado escribiendo una serie de GraphQL utilizando el lenguaje de programación Go. Primero vimos cómo empezar con GraphQL y Goseguido de una forma alternativa de manejar las relaciones de datos mediante el uso de resolvers en objetos GraphQL. Yendo un paso más allá vimos cómo incluir Tokens web JSON (JWT) para autorización sobre objetos GraphQL, pero sin base de datos.

El siguiente paso lógico en este viaje de GraphQL con Golang sería cablear Couchbase a una API con GraphQL completamente funcional que incluye autorización con tokens web JSON (JWT). Vamos a ver cómo manejar la creación de cuentas, validación JWT, y trabajar con datos en vivo a través de Consultas GraphQL.

Antes de sumergirte en algo de diseño y desarrollo, si no has visto mis tutoriales anteriores sobre el tema, probablemente deberías. Yo no recomendaría entrar en el lado JWT de las cosas hasta que tenga una comprensión de la utilización de GraphQL con Golang.

Inclusión de Couchbase en una aplicación GraphQL con JWT

En lugar de reiterar sobre el proceso de creación de una aplicación alimentada GraphQL, vamos a empezar desde donde lo dejamos en la serie. El tutorial anterior sobre JWT de la serie nos dejó el siguiente código:

Nuestro objetivo ahora es cambiar todos esos datos simulados por datos reales que existen en Couchbase. No nos preocuparemos de crear datos de blog en este tutorial, pero si quieres aprender sobre mutaciones, echa un vistazo a uno de los tutoriales anteriores.

El primer paso obvio hacia el uso de datos dinámicos es configurar nuestra base de datos, Couchbase. Cree la siguiente variable global que se utilizará en cada uno de nuestros objetos GraphQL:

Con la referencia global Bucket creada, vamos a establecer una conexión con nuestro cluster Couchbase y abrir un bucket. Esto se puede hacer en nuestro proyecto principal función:

El código anterior asume un cluster ejecutándose localmente y RBAC así como la información de Bucket ya creada y definida. Si no has configurado correctamente tu instancia de Couchbase para esta aplicación, tómate un momento para hacerlo.

Dado que estamos trabajando con una base de datos NoSQL y ya no simulamos datos, nuestras estructuras Go nativas deben cambiar ligeramente:

Al añadir un Tipo podemos escribir mejores consultas porque podemos diferenciar nuestros datos. Cambiar las estructuras de datos de Go no significa que tengamos que actualizar nuestros objetos GraphQL. Lo que esperamos devolver frente a con lo que esperamos trabajar puede ser diferente.

En el ejemplo anterior estábamos generando nuestro token web JSON con información pasada. En realidad, queremos generar nuestro JWT con la información real de la cuenta. Para hacer esto posible, necesitamos crear un endpoint para la creación de cuentas:

La función anterior tomará un nombre de usuario y contraseña, hash de la contraseña con bcrypt, y la inserta en la base de datos. Estaremos consultando la base de datos para esta cuenta y comparando el hash con una contraseña como medio de autenticación. Para ello, probablemente deberíamos actualizar nuestro CreateTokenEndpoint función:

Fíjate que en lugar de tomar el nombre de usuario y contraseña pasados y crear un JWT a partir de ellos, estamos haciendo una consulta a la base de datos. Si la información no coincide con lo que se pasó, vamos a devolver un error, de lo contrario vamos a seguir para crear un JWT basado en nuestro nombre de usuario.

Asumiendo que tenemos una forma sólida de crear cuentas y generar tokens web JSON a partir de ellas, podemos empezar a alterar nuestros objetos GraphQL para usar Couchbase en lugar de datos mock.

Dentro de la principal tenemos una función rootQuery con un objeto blogs así como una consulta cuenta consulta. Definiremos nuestra blogs y sería algo parecido a esto:

En lugar de devolver una lista simulada de datos del blog estamos haciendo una consulta N1QL y devolviendo los resultados. La estructura de datos Go se asigna a nuestro objeto GraphQL.

Aunque estemos devolviendo datos del blog a través de nuestra consulta N1QL, la función páginas vistas sigue estando protegida con JWT como se define en el objeto.

La consulta final que tenemos es algo parecido a esto:

Observa que estamos recuperando la información decodificada del token y usándola como parámetro en nuestra consulta N1QL. Así es como podemos consultar una cuenta en particular basándonos en los datos del token, o en el usuario que ha iniciado sesión actualmente.

Prueba a crear algunos datos en la base de datos y mira a ver qué pasa.

Conclusión

Terminamos nuestra serie GraphQL con Go configurando Couchbase en nuestro ejemplo de autorización JWT. En realidad, añadir Couchbase no cambió nada de nuestro ejemplo JWT, sólo nos dio una fuente de datos para ser utilizada. Si profundizas en los tutoriales anteriores de esta serie, te adentrarás en GraphQL, que incluye consultas, mutaciones y protección de consultas, así como de fragmentos de datos. Todas las cosas que esperarías en una API lista para producción, pero con GraphQL en lugar de un enfoque tradicional de API REST.

Autor

Publicado por Nic Raboy, Defensor del Desarrollador, Couchbase

Nic Raboy es un defensor de las tecnologías modernas de desarrollo web y móvil. Tiene experiencia en Java, JavaScript, Golang y una variedad de frameworks como Angular, NativeScript y Apache Cordova. Nic escribe sobre sus experiencias de desarrollo relacionadas con hacer el desarrollo web y móvil más fácil de entender.

Dejar una respuesta