{"id":5452,"date":"2018-07-19T07:00:39","date_gmt":"2018-07-19T14:00:39","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5452"},"modified":"2025-06-13T18:32:51","modified_gmt":"2025-06-14T01:32:51","slug":"authorization-with-graphql-golang-and-couchbase-nosql-using-jwt","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/","title":{"rendered":"Uso de JWT para autorizaci\u00f3n con GraphQL, Go y Couchbase"},"content":{"rendered":"<p>Durante los \u00faltimos meses he estado escribiendo una serie de GraphQL utilizando el lenguaje de programaci\u00f3n Go. Primero vimos c\u00f3mo <a href=\"https:\/\/www.couchbase.com\/blog\/es\/using-graphql-with-golang-and-a-nosql-database\/\" target=\"_blank\" rel=\"noopener noreferrer\">empezar con GraphQL y Go<\/a>seguido de una forma alternativa de <a href=\"https:\/\/www.couchbase.com\/blog\/es\/data-relationships-with-graphql-and-nosql-in-a-golang-application\/\" target=\"_blank\" rel=\"noopener noreferrer\">manejar las relaciones de datos mediante el uso de resolvers<\/a> en objetos GraphQL. Yendo un paso m\u00e1s all\u00e1 vimos c\u00f3mo incluir <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2018\/07\/jwt-authorization-graphql-api-using-golang\" target=\"_blank\" rel=\"noopener noreferrer\">Tokens web JSON (JWT) para autorizaci\u00f3n<\/a> sobre objetos GraphQL, pero sin base de datos.<\/p>\n<p>El siguiente paso l\u00f3gico en este viaje de GraphQL con Golang ser\u00eda cablear <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase<\/a> a una API con GraphQL completamente funcional que incluye autorizaci\u00f3n con tokens web JSON (JWT). Vamos a ver c\u00f3mo manejar la creaci\u00f3n de cuentas, validaci\u00f3n JWT, y trabajar con datos en vivo a trav\u00e9s de <a href=\"https:\/\/www.couchbase.com\/blog\/es\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\">Consultas GraphQL<\/a>.<\/p>\n<p><!--more--><\/p>\n<p>Antes de sumergirte en algo de dise\u00f1o y desarrollo, si no has visto mis tutoriales anteriores sobre el tema, probablemente deber\u00edas. Yo no recomendar\u00eda entrar en el lado JWT de las cosas hasta que tenga una comprensi\u00f3n de la utilizaci\u00f3n de <a href=\"https:\/\/graphql.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">GraphQL<\/a> con Golang.<\/p>\n<h2>Inclusi\u00f3n de Couchbase en una aplicaci\u00f3n GraphQL con JWT<\/h2>\n<p>En lugar de reiterar sobre el proceso de creaci\u00f3n de una aplicaci\u00f3n alimentada GraphQL, vamos a empezar desde donde lo dejamos en la serie. El <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2018\/07\/jwt-authorization-graphql-api-using-golang\" target=\"_blank\" rel=\"noopener noreferrer\">tutorial anterior sobre JWT<\/a> de la serie nos dej\u00f3 el siguiente c\u00f3digo:<\/p>\n<pre class=\"lang:default decode:true\">package main\r\n\r\nimport (\r\n\t\"context\"\r\n\t\"encoding\/json\"\r\n\t\"errors\"\r\n\t\"fmt\"\r\n\t\"net\/http\"\r\n\r\n\tjwt \"github.com\/dgrijalva\/jwt-go\"\r\n\t\"github.com\/graphql-go\/graphql\"\r\n\t\"github.com\/mitchellh\/mapstructure\"\r\n)\r\n\r\ntype User struct {\r\n\tId       string `json:\"id\"`\r\n\tUsername string `json:\"username\"`\r\n\tPassword string `json:\"password\"`\r\n}\r\n\r\ntype Blog struct {\r\n\tId        string `json:\"id\"`\r\n\tTitle     string `json:\"title\"`\r\n\tContent   string `json:\"content\"`\r\n\tAuthor    string `json:\"author\"`\r\n\tPageviews int32  `json:\"pageviews\"`\r\n}\r\n\r\nvar jwtSecret []byte = []byte(\"thepolyglotdeveloper\")\r\n\r\nvar accountsMock []User = []User{\r\n\tUser{\r\n\t\tId:       \"1\",\r\n\t\tUsername: \"nraboy\",\r\n\t\tPassword: \"1234\",\r\n\t},\r\n\tUser{\r\n\t\tId:       \"2\",\r\n\t\tUsername: \"mraboy\",\r\n\t\tPassword: \"5678\",\r\n\t},\r\n}\r\n\r\nvar blogsMock []Blog = []Blog{\r\n\tBlog{\r\n\t\tId:        \"1\",\r\n\t\tAuthor:    \"nraboy\",\r\n\t\tTitle:     \"Sample Article\",\r\n\t\tContent:   \"This is a sample article written by Nic Raboy\",\r\n\t\tPageviews: 1000,\r\n\t},\r\n}\r\n\r\nvar accountType *graphql.Object = graphql.NewObject(graphql.ObjectConfig{\r\n\tName: \"Account\",\r\n\tFields: graphql.Fields{\r\n\t\t\"id\": &amp;graphql.Field{\r\n\t\t\tType: graphql.String,\r\n\t\t},\r\n\t\t\"username\": &amp;graphql.Field{\r\n\t\t\tType: graphql.String,\r\n\t\t},\r\n\t\t\"password\": &amp;graphql.Field{\r\n\t\t\tType: graphql.String,\r\n\t\t},\r\n\t},\r\n})\r\n\r\nvar blogType *graphql.Object = graphql.NewObject(graphql.ObjectConfig{\r\n\tName: \"Blog\",\r\n\tFields: graphql.Fields{\r\n\t\t\"id\": &amp;graphql.Field{\r\n\t\t\tType: graphql.String,\r\n\t\t},\r\n\t\t\"title\": &amp;graphql.Field{\r\n\t\t\tType: graphql.String,\r\n\t\t},\r\n\t\t\"content\": &amp;graphql.Field{\r\n\t\t\tType: graphql.String,\r\n\t\t},\r\n\t\t\"author\": &amp;graphql.Field{\r\n\t\t\tType: graphql.String,\r\n\t\t},\r\n\t\t\"pageviews\": &amp;graphql.Field{\r\n\t\t\tType: graphql.Int,\r\n\t\t\tResolve: func(params graphql.ResolveParams) (interface{}, error) {\r\n\t\t\t\t_, err := ValidateJWT(params.Context.Value(\"token\").(string))\r\n\t\t\t\tif err != nil {\r\n\t\t\t\t\treturn nil, err\r\n\t\t\t\t}\r\n\t\t\t\treturn params.Source.(Blog).Pageviews, nil\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n})\r\n\r\nfunc ValidateJWT(t string) (interface{}, error) {\r\n\tif t == \"\" {\r\n\t\treturn nil, errors.New(\"Authorization token must be present\")\r\n\t}\r\n\ttoken, _ := jwt.Parse(t, func(token *jwt.Token) (interface{}, error) {\r\n\t\tif _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {\r\n\t\t\treturn nil, fmt.Errorf(\"There was an error\")\r\n\t\t}\r\n\t\treturn jwtSecret, nil\r\n\t})\r\n\tif claims, ok := token.Claims.(jwt.MapClaims); ok &amp;&amp; token.Valid {\r\n\t\tvar decodedToken interface{}\r\n\t\tmapstructure.Decode(claims, &amp;decodedToken)\r\n\t\treturn decodedToken, nil\r\n\t} else {\r\n\t\treturn nil, errors.New(\"Invalid authorization token\")\r\n\t}\r\n}\r\n\r\nfunc CreateTokenEndpoint(response http.ResponseWriter, request *http.Request) {\r\n\tvar user User\r\n\t_ = json.NewDecoder(request.Body).Decode(&amp;user)\r\n\ttoken := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{\r\n\t\t\"username\": user.Username,\r\n\t\t\"password\": user.Password,\r\n\t})\r\n\ttokenString, error := token.SignedString(jwtSecret)\r\n\tif error != nil {\r\n\t\tfmt.Println(error)\r\n\t}\r\n\tresponse.Header().Set(\"content-type\", \"application\/json\")\r\n\tresponse.Write([]byte(`{ \"token\": \"` + tokenString + `\" }`))\r\n}\r\n\r\nfunc main() {\r\n\tfmt.Println(\"Starting the application at :12345...\")\r\n\trootQuery := graphql.NewObject(graphql.ObjectConfig{\r\n\t\tName: \"Query\",\r\n\t\tFields: graphql.Fields{\r\n\t\t\t\"account\": &amp;graphql.Field{\r\n\t\t\t\tType: accountType,\r\n\t\t\t\tResolve: func(params graphql.ResolveParams) (interface{}, error) {\r\n\t\t\t\t\taccount, err := ValidateJWT(params.Context.Value(\"token\").(string))\r\n\t\t\t\t\tif err != nil {\r\n\t\t\t\t\t\treturn nil, err\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfor _, accountMock := range accountsMock {\r\n\t\t\t\t\t\tif accountMock.Username == account.(User).Username {\r\n\t\t\t\t\t\t\treturn accountMock, nil\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn &amp;User{}, nil\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\t\"blogs\": &amp;graphql.Field{\r\n\t\t\t\tType: graphql.NewList(blogType),\r\n\t\t\t\tResolve: func(params graphql.ResolveParams) (interface{}, error) {\r\n\t\t\t\t\treturn blogsMock, nil\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t},\r\n\t})\r\n\tschema, _ := graphql.NewSchema(graphql.SchemaConfig{\r\n\t\tQuery: rootQuery,\r\n\t})\r\n\thttp.HandleFunc(\"\/graphql\", func(response http.ResponseWriter, request *http.Request) {\r\n\t\tresult := graphql.Do(graphql.Params{\r\n\t\t\tSchema:        schema,\r\n\t\t\tRequestString: request.URL.Query().Get(\"query\"),\r\n\t\t\tContext:       context.WithValue(context.Background(), \"token\", request.URL.Query().Get(\"token\")),\r\n\t\t})\r\n\t\tjson.NewEncoder(response).Encode(result)\r\n\t})\r\n\thttp.HandleFunc(\"\/login\", CreateTokenEndpoint)\r\n\thttp.ListenAndServe(\":12345\", nil)\r\n}<\/pre>\n<p>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.<\/p>\n<p>El primer paso obvio hacia el uso de datos din\u00e1micos es configurar nuestra base de datos, Couchbase. Cree la siguiente variable global que se utilizar\u00e1 en cada uno de nuestros objetos GraphQL:<\/p>\n<pre class=\"lang:default decode:true\">var bucket *gocb.Bucket<\/pre>\n<p>Con la referencia global Bucket creada, vamos a establecer una conexi\u00f3n con nuestro cluster Couchbase y abrir un bucket. Esto se puede hacer en nuestro proyecto <code>principal<\/code> funci\u00f3n:<\/p>\n<pre class=\"lang:default decode:true\">cluster, _ := gocb.Connect(\"couchbase:\/\/localhost\")\r\ncluster.Authenticate(gocb.PasswordAuthenticator{Username: \"example\", Password: \"123456\"})\r\nbucket, _ = cluster.OpenBucket(\"example\", \"\")<\/pre>\n<p>El c\u00f3digo anterior asume un cluster ejecut\u00e1ndose localmente y RBAC as\u00ed como la informaci\u00f3n de Bucket ya creada y definida. Si no has configurado correctamente tu instancia de Couchbase para esta aplicaci\u00f3n, t\u00f3mate un momento para hacerlo.<\/p>\n<p>Dado que estamos trabajando con una base de datos NoSQL y ya no simulamos datos, nuestras estructuras Go nativas deben cambiar ligeramente:<\/p>\n<pre class=\"lang:default decode:true\">type User struct {\r\n\tId       string `json:\"id,omitempty\"`\r\n\tUsername string `json:\"username\"`\r\n\tPassword string `json:\"password\"`\r\n\tType     string `json:\"type\"`\r\n}\r\n\r\ntype Blog struct {\r\n\tId        string `json:\"id,omitempty\"`\r\n\tTitle     string `json:\"title\"`\r\n\tContent   string `json:\"content\"`\r\n\tAuthor    string `json:\"author\"`\r\n\tPageviews int32  `json:\"pageviews\"`\r\n\tType      string `json:\"type\"`\r\n}<\/pre>\n<p>Al a\u00f1adir un <code>Tipo<\/code> 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.<\/p>\n<p>En el ejemplo anterior est\u00e1bamos generando nuestro token web JSON con informaci\u00f3n pasada. En realidad, queremos generar nuestro JWT con la informaci\u00f3n real de la cuenta. Para hacer esto posible, necesitamos crear un endpoint para la creaci\u00f3n de cuentas:<\/p>\n<pre class=\"lang:default decode:true\">func CreateAccountEndpoint(response http.ResponseWriter, request *http.Request) {\r\n\tresponse.Header().Set(\"content-type\", \"application\/json\")\r\n\tvar account User\r\n\tjson.NewDecoder(request.Body).Decode(&amp;account)\r\n\thash, _ := bcrypt.GenerateFromPassword([]byte(account.Password), 10)\r\n\taccount.Password = string(hash)\r\n\tid, _ := uuid.NewV4()\r\n\tbucket.Insert(id.String(), account, 0)\r\n\tresponse.Write([]byte(`{ \"id\": \"` + id.String() + `\" }`))\r\n}<\/pre>\n<p>La funci\u00f3n anterior tomar\u00e1 un nombre de usuario y contrase\u00f1a, hash de la contrase\u00f1a 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\u00f1a como medio de autenticaci\u00f3n. Para ello, probablemente deber\u00edamos actualizar nuestro <code>CreateTokenEndpoint<\/code> funci\u00f3n:<\/p>\n<pre class=\"lang:default decode:true\">func CreateTokenEndpoint(response http.ResponseWriter, request *http.Request) {\r\n\tresponse.Header().Set(\"content-type\", \"application\/json\")\r\n\tvar user User\r\n\t_ = json.NewDecoder(request.Body).Decode(&amp;user)\r\n\tquery := gocb.NewN1qlQuery(\"SELECT example.* FROM example WHERE type = 'account' AND username = $1\")\r\n\tvar params []interface{}\r\n\tparams = append(params, user.Username)\r\n\tresults, _ := bucket.ExecuteN1qlQuery(query, params)\r\n\tvar account User\r\n\tresults.One(&amp;account)\r\n\tif bcrypt.CompareHashAndPassword([]byte(account.Password), []byte(user.Password)) != nil {\r\n\t\tresponse.Write([]byte(`{ \"message\": \"incorrect password\" }`))\r\n\t\treturn\r\n\t}\r\n\ttoken := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{\r\n\t\t\"Username\": account.Username,\r\n\t})\r\n\ttokenString, error := token.SignedString(jwtSecret)\r\n\tif error != nil {\r\n\t\tfmt.Println(error)\r\n\t}\r\n\tresponse.Write([]byte(`{ \"token\": \"` + tokenString + `\" }`))\r\n}<\/pre>\n<p>F\u00edjate que en lugar de tomar el nombre de usuario y contrase\u00f1a pasados y crear un JWT a partir de ellos, estamos haciendo una consulta a la base de datos. Si la informaci\u00f3n no coincide con lo que se pas\u00f3, vamos a devolver un error, de lo contrario vamos a seguir para crear un JWT basado en nuestro nombre de usuario.<\/p>\n<p>Asumiendo que tenemos una forma s\u00f3lida 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.<\/p>\n<p>Dentro de la <code>principal<\/code> tenemos una funci\u00f3n <code>rootQuery<\/code> con un objeto <code>blogs<\/code> as\u00ed como una consulta <code>cuenta<\/code> consulta. Definiremos nuestra <code>blogs<\/code> y ser\u00eda algo parecido a esto:<\/p>\n<pre class=\"lang:default decode:true\">\"blogs\": &amp;graphql.Field{\r\n\tType: graphql.NewList(blogType),\r\n\tResolve: func(params graphql.ResolveParams) (interface{}, error) {\r\n\t\tquery := gocb.NewN1qlQuery(\"SELECT example.* FROM example WHERE type = 'blog'\")\r\n\t\tresults, _ := bucket.ExecuteN1qlQuery(query, nil)\r\n\t\tvar result Blog\r\n\t\tvar blogs []Blog\r\n\t\tfor results.Next(&amp;result) {\r\n\t\t\tblogs = append(blogs, result)\r\n\t\t}\r\n\t\treturn blogs, nil\r\n\t},\r\n},<\/pre>\n<p>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.<\/p>\n<p>Aunque estemos devolviendo datos del blog a trav\u00e9s de nuestra consulta N1QL, la funci\u00f3n <code>p\u00e1ginas vistas<\/code> sigue estando protegida con JWT como se define en el objeto.<\/p>\n<p>La consulta final que tenemos es algo parecido a esto:<\/p>\n<pre class=\"lang:default decode:true\">\"account\": &amp;graphql.Field{\r\n\tType: accountType,\r\n\tResolve: func(params graphql.ResolveParams) (interface{}, error) {\r\n\t\taccount, err := ValidateJWT(params.Context.Value(\"token\").(string))\r\n\t\tif err != nil {\r\n\t\t\treturn nil, err\r\n\t\t}\r\n\t\tvar user User\r\n\t\tmapstructure.Decode(account, &amp;user)\r\n\t\tquery := gocb.NewN1qlQuery(\"SELECT example.* FROM example WHERE type = 'account' AND username = $1\")\r\n\t\tvar n1qlParams []interface{}\r\n\t\tn1qlParams = append(n1qlParams, user.Username)\r\n\t\tresults, _ := bucket.ExecuteN1qlQuery(query, n1qlParams)\r\n\t\tresults.One(&amp;user)\r\n\t\treturn user, nil\r\n\t},\r\n},<\/pre>\n<p>Observa que estamos recuperando la informaci\u00f3n decodificada del token y us\u00e1ndola como par\u00e1metro en nuestra consulta N1QL. As\u00ed es como podemos consultar una cuenta en particular bas\u00e1ndonos en los datos del token, o en el usuario que ha iniciado sesi\u00f3n actualmente.<\/p>\n<p>Prueba a crear algunos datos en la base de datos y mira a ver qu\u00e9 pasa.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Terminamos nuestra serie GraphQL con Go configurando <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase<\/a> en nuestro ejemplo de autorizaci\u00f3n JWT. En realidad, a\u00f1adir Couchbase no cambi\u00f3 nada de nuestro ejemplo JWT, s\u00f3lo nos dio una fuente de datos para ser utilizada. Si profundizas en los tutoriales anteriores de esta serie, te adentrar\u00e1s en GraphQL, que incluye consultas, mutaciones y protecci\u00f3n de consultas, as\u00ed como de fragmentos de datos. Todas las cosas que esperar\u00edas en una API lista para producci\u00f3n, pero con GraphQL en lugar de un enfoque tradicional de API REST.<\/p>","protected":false},"excerpt":{"rendered":"<p>Over the past few months I&#8217;ve been writing a GraphQL series using the Go programming language. First we saw how to get started with GraphQL and Go, followed by an alternative way to handle data relationships by using resolvers on [&hellip;]<\/p>","protected":false},"author":63,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,1816,1820,1812],"tags":[2210,1261,2251],"ppma_author":[9032],"class_list":["post-5452","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-couchbase-server","category-golang","category-n1ql-query","tag-graphql","tag-json","tag-jwt"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.4 (Yoast SEO v26.4) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Using JWT for Authorization With GraphQL, Go, and Couchbase<\/title>\n<meta name=\"description\" content=\"Learn how to create a web application that uses Couchbase NoSQL, Golang, GraphQL, and JSON web tokens (JWT) for the authorization component.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using JWT for Authorization With GraphQL, Go, and Couchbase\" \/>\n<meta property=\"og:description\" content=\"Learn how to create a web application that uses Couchbase NoSQL, Golang, GraphQL, and JSON web tokens (JWT) for the authorization component.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2018-07-19T14:00:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T01:32:51+00:00\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Using JWT for Authorization With GraphQL, Go, and Couchbase\",\"datePublished\":\"2018-07-19T14:00:39+00:00\",\"dateModified\":\"2025-06-14T01:32:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/\"},\"wordCount\":823,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"graphql\",\"JSON\",\"jwt\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Server\",\"GoLang\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/\",\"name\":\"Using JWT for Authorization With GraphQL, Go, and Couchbase\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2018-07-19T14:00:39+00:00\",\"dateModified\":\"2025-06-14T01:32:51+00:00\",\"description\":\"Learn how to create a web application that uses Couchbase NoSQL, Golang, GraphQL, and JSON web tokens (JWT) for the authorization component.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using JWT for Authorization With GraphQL, Go, and Couchbase\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Uso de JWT para autorizaci\u00f3n con GraphQL, Go y Couchbase","description":"Aprende a crear una aplicaci\u00f3n web que utiliza Couchbase NoSQL, Golang, GraphQL y tokens web JSON (JWT) para el componente de autorizaci\u00f3n.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/","og_locale":"es_MX","og_type":"article","og_title":"Using JWT for Authorization With GraphQL, Go, and Couchbase","og_description":"Learn how to create a web application that uses Couchbase NoSQL, Golang, GraphQL, and JSON web tokens (JWT) for the authorization component.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2018-07-19T14:00:39+00:00","article_modified_time":"2025-06-14T01:32:51+00:00","author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Using JWT for Authorization With GraphQL, Go, and Couchbase","datePublished":"2018-07-19T14:00:39+00:00","dateModified":"2025-06-14T01:32:51+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/"},"wordCount":823,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["graphql","JSON","jwt"],"articleSection":["Application Design","Best Practices and Tutorials","Couchbase Server","GoLang","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/","url":"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/","name":"Uso de JWT para autorizaci\u00f3n con GraphQL, Go y Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2018-07-19T14:00:39+00:00","dateModified":"2025-06-14T01:32:51+00:00","description":"Aprende a crear una aplicaci\u00f3n web que utiliza Couchbase NoSQL, Golang, GraphQL y tokens web JSON (JWT) para el componente de autorizaci\u00f3n.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Using JWT for Authorization With GraphQL, Go, and Couchbase"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. 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\u00f3vil m\u00e1s f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy es un defensor de las tecnolog\u00edas modernas de desarrollo web y m\u00f3vil. 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\u00f3vil m\u00e1s f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5452","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=5452"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5452\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=5452"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=5452"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=5452"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=5452"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}