{"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\/pt\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/","title":{"rendered":"Uso de JWT para autoriza\u00e7\u00e3o com GraphQL, Go e Couchbase"},"content":{"rendered":"<p>Nos \u00faltimos meses, escrevi uma s\u00e9rie sobre GraphQL usando a linguagem de programa\u00e7\u00e3o Go. Primeiro, vimos como <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/using-graphql-with-golang-and-a-nosql-database\/\" target=\"_blank\" rel=\"noopener noreferrer\">Comece a usar GraphQL e Go<\/a>seguido de uma maneira alternativa de <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/data-relationships-with-graphql-and-nosql-in-a-golang-application\/\" target=\"_blank\" rel=\"noopener noreferrer\">lidar com relacionamentos de dados usando resolvedores<\/a> em objetos GraphQL. Dando um passo adiante, vimos como incluir <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2018\/07\/jwt-authorization-graphql-api-using-golang\" target=\"_blank\" rel=\"noopener noreferrer\">Tokens da Web JSON (JWT) para autoriza\u00e7\u00e3o<\/a> em objetos GraphQL, mas sem um banco de dados.<\/p>\n<p>A pr\u00f3xima etapa l\u00f3gica nessa jornada do GraphQL com Golang seria conectar o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase<\/a> para uma API com tecnologia GraphQL totalmente funcional que inclui autoriza\u00e7\u00e3o com tokens da Web JSON (JWT). Veremos como lidar com a cria\u00e7\u00e3o de contas, a valida\u00e7\u00e3o de JWT e o trabalho com dados em tempo real por meio de <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/processing-graphql-queries-with-java-spring-boot-and-nosql\/\">Consultas GraphQL<\/a>.<\/p>\n<p><!--more--><\/p>\n<p>Antes de mergulhar no design e no desenvolvimento, se voc\u00ea ainda n\u00e3o viu meus tutoriais anteriores sobre o assunto, provavelmente deveria ver. Eu n\u00e3o recomendaria entrar na parte do JWT at\u00e9 que voc\u00ea tenha um conhecimento sobre o uso de <a href=\"https:\/\/graphql.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">GraphQL<\/a> com a Golang.<\/p>\n<h2>Inclus\u00e3o do Couchbase em um aplicativo GraphQL com JWT<\/h2>\n<p>Em vez de reiterar o processo de cria\u00e7\u00e3o de um aplicativo alimentado por GraphQL, vamos come\u00e7ar de onde paramos na s\u00e9rie. O <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2018\/07\/jwt-authorization-graphql-api-using-golang\" target=\"_blank\" rel=\"noopener noreferrer\">tutorial anterior sobre JWT<\/a> na s\u00e9rie nos deixou com o seguinte c\u00f3digo:<\/p>\n<pre class=\"lang:default decode:true\">pacote principal\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\tNome de usu\u00e1rio string `json: \"username\"`\r\n\tSenha string `json: \"senha\"`\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\tAutor string `json: \"autor\"`\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\tUsu\u00e1rio{\r\n\t\tId:       \"1\",\r\n\t\tNome de usu\u00e1rio: \"nraboy\",\r\n\t\tSenha: \"1234\",\r\n\t},\r\n\tUsu\u00e1rio{\r\n\t\tId:       \"2\",\r\n\t\tNome de usu\u00e1rio: \"mraboy\",\r\n\t\tSenha: \"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\tT\u00edtulo:     \"Artigo de amostra\",\r\n\t\tContent:   \"Este \u00e9 um exemplo de artigo escrito por Nic Raboy\",\r\n\t\tVisualiza\u00e7\u00f5es de p\u00e1gina: 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\"nome de usu\u00e1rio\": &amp;graphql.Field{\r\n\t\t\tType: graphql.String,\r\n\t\t},\r\n\t\t\"password\" (senha): &amp;graphql.Field{\r\n\t\t\tTipo: 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\" (conte\u00fado): &amp;graphql.Field{\r\n\t\t\tTipo: graphql.String,\r\n\t\t},\r\n\t\t\"author\" (autor): &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\tse 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\tse t == \"\" {\r\n\t\treturn nil, errors.New(\"O token de autoriza\u00e7\u00e3o deve estar presente\")\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(\"Houve um erro\")\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(\"Token de autoriza\u00e7\u00e3o inv\u00e1lido\")\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\tse 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(\"Iniciando o aplicativo em :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\tse 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>Nosso objetivo agora \u00e9 trocar todos esses dados simulados por dados reais que existem no Couchbase. N\u00e3o nos preocuparemos com a cria\u00e7\u00e3o de dados de blog neste tutorial, mas se voc\u00ea quiser aprender sobre muta\u00e7\u00f5es, consulte um dos tutoriais anteriores.<\/p>\n<p>A primeira etapa \u00f3bvia para usar dados din\u00e2micos \u00e9 configurar nosso banco de dados, o Couchbase. Crie a seguinte vari\u00e1vel global para ser usada em cada um de nossos objetos GraphQL:<\/p>\n<pre class=\"lang:default decode:true\">var bucket *gocb.Bucket<\/pre>\n<p>Com a refer\u00eancia global do Bucket criada, vamos estabelecer uma conex\u00e3o com nosso cluster do Couchbase e abrir um bucket. Isso pode ser feito na se\u00e7\u00e3o <code>principal<\/code> fun\u00e7\u00e3o:<\/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>O c\u00f3digo acima pressup\u00f5e um cluster em execu\u00e7\u00e3o localmente e RBAC, bem como informa\u00e7\u00f5es de Bucket j\u00e1 criadas e definidas. Se voc\u00ea n\u00e3o tiver configurado adequadamente sua inst\u00e2ncia do Couchbase para esse aplicativo, reserve um momento para fazer isso.<\/p>\n<p>Como estamos trabalhando com um banco de dados NoSQL e n\u00e3o mais com dados simulados, nossas estruturas nativas em Go precisam ser ligeiramente alteradas:<\/p>\n<pre class=\"lang:default decode:true\">type User struct {\r\n\tId string `json: \"id,omitempty\"`\r\n\tNome de usu\u00e1rio string `json: \"username\"`\r\n\tSenha string `json: \"senha\"`\r\n\tTipo string `json: \"tipo\"`\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\tAutor string `json: \"autor\"`\r\n\tPageviews int32 `json: \"pageviews\"`\r\n\tTipo string `json: \"tipo\"`\r\n}<\/pre>\n<p>Ao adicionar um <code>Tipo<\/code> podemos escrever consultas melhores porque podemos diferenciar nossos dados. Alterar as estruturas de dados Go n\u00e3o significa que precisamos atualizar nossos objetos GraphQL. O que esperamos retornar em compara\u00e7\u00e3o com o que esperamos trabalhar pode ser diferente.<\/p>\n<p>No exemplo anterior, est\u00e1vamos gerando nosso token da Web JSON com informa\u00e7\u00f5es passadas. Na realidade, queremos gerar nosso JWT com informa\u00e7\u00f5es reais da conta. Para que isso seja poss\u00edvel, precisamos criar um ponto de extremidade para a cria\u00e7\u00e3o de contas:<\/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>A fun\u00e7\u00e3o acima receber\u00e1 um nome de usu\u00e1rio e uma senha, far\u00e1 o hash da senha com bcrypt e a inserir\u00e1 no banco de dados. Consultaremos o banco de dados para essa conta e compararemos o hash com uma senha como meio de autentica\u00e7\u00e3o. Para fazer isso, provavelmente devemos atualizar nosso <code>CreateTokenEndpoint<\/code> fun\u00e7\u00e3o:<\/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 Usu\u00e1rio\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\tse error != nil {\r\n\t\tfmt.Println(error)\r\n\t}\r\n\tresponse.Write([]byte(`{ \"token\": \"` + tokenString + `\" }`))\r\n}<\/pre>\n<p>Observe que, em vez de pegar o nome de usu\u00e1rio e a senha passados e criar um JWT a partir deles, estamos fazendo uma consulta ao banco de dados. Se as informa\u00e7\u00f5es n\u00e3o corresponderem ao que foi passado, retornaremos um erro; caso contr\u00e1rio, continuaremos a criar um JWT com base em nosso nome de usu\u00e1rio.<\/p>\n<p>Supondo que tenhamos uma maneira s\u00f3lida de criar contas e gerar tokens da Web JSON a partir delas, podemos come\u00e7ar a alterar nossos objetos GraphQL para usar o Couchbase em vez de dados simulados.<\/p>\n<p>Dentro do <code>principal<\/code> temos uma fun\u00e7\u00e3o <code>rootQuery<\/code> com um objeto <code>blogs<\/code> bem como uma consulta <code>conta<\/code> consulta. Definiremos nossa <code>blogs<\/code> primeiro, e seria algo parecido com isto:<\/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>Em vez de retornar uma lista simulada de dados do blog, estamos fazendo uma consulta N1QL e retornando os resultados. A estrutura de dados Go \u00e9 mapeada para o nosso objeto GraphQL.<\/p>\n<p>Embora estejamos retornando dados de blog por meio de nossa consulta N1QL, o <code>visualiza\u00e7\u00f5es de p\u00e1gina<\/code> ainda est\u00e1 protegida com o JWT, conforme definido no objeto.<\/p>\n<p>A consulta final que temos \u00e9 mais ou menos assim:<\/p>\n<pre class=\"lang:default decode:true\">\"account\": &amp;graphql.Field{\r\n\tTipo: accountType,\r\n\tResolve: func(params graphql.ResolveParams) (interface{}, error) {\r\n\t\taccount, err := ValidateJWT(params.Context.Value(\"token\").(string))\r\n\t\tse err != nil {\r\n\t\t\treturn nil, err\r\n\t\t}\r\n\t\tvar user Usu\u00e1rio\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>Observe que estamos recuperando as informa\u00e7\u00f5es do token decodificado e usando-as como par\u00e2metro em nossa consulta N1QL. \u00c9 assim que podemos consultar uma determinada conta com base nos dados do token ou no usu\u00e1rio conectado no momento.<\/p>\n<p>Tente criar alguns dados no banco de dados e veja o que acontece.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Encerramos nossa s\u00e9rie sobre GraphQL com Go configurando <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase<\/a> em nosso exemplo de autoriza\u00e7\u00e3o JWT. Na realidade, adicionar o Couchbase n\u00e3o alterou nada do nosso exemplo de JWT, apenas nos deu uma fonte de dados a ser usada. Se voc\u00ea pesquisar os tutoriais anteriores desta s\u00e9rie, conhecer\u00e1 a fundo o GraphQL, que inclui consultas, muta\u00e7\u00f5es e prote\u00e7\u00e3o de consultas, al\u00e9m de partes de dados. Tudo o que voc\u00ea esperaria de uma API pronta para produ\u00e7\u00e3o, mas com GraphQL em vez de uma abordagem 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 v25.8 (Yoast SEO v25.8) - 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\/pt\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\",\"@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\/pt\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Uso de JWT para autoriza\u00e7\u00e3o com GraphQL, Go e Couchbase","description":"Saiba como criar um aplicativo da Web que usa o Couchbase NoSQL, Golang, GraphQL e tokens da Web JSON (JWT) para o componente de autoriza\u00e7\u00e3o.","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\/pt\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/","og_locale":"pt_BR","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\/pt\/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":"pt-BR","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 autoriza\u00e7\u00e3o com GraphQL, Go e 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":"Saiba como criar um aplicativo da Web que usa o Couchbase NoSQL, Golang, GraphQL e tokens da Web JSON (JWT) para o componente de autoriza\u00e7\u00e3o.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/authorization-with-graphql-golang-and-couchbase-nosql-using-jwt\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"Blog do Couchbase","description":"Couchbase, o banco de dados 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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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 dos desenvolvedores, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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 \u00e9 um defensor das modernas tecnologias de desenvolvimento m\u00f3vel e da Web. Ele tem experi\u00eancia em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experi\u00eancias de desenvolvimento relacionadas a tornar o desenvolvimento m\u00f3vel e da Web mais f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/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 \u00e9 um defensor das modernas tecnologias de desenvolvimento m\u00f3vel e da Web. Ele tem experi\u00eancia em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experi\u00eancias de desenvolvimento relacionadas a tornar o desenvolvimento m\u00f3vel e da Web mais f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/5452","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=5452"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/5452\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=5452"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=5452"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=5452"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=5452"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}