{"id":2038,"date":"2015-12-08T22:18:57","date_gmt":"2015-12-08T22:18:56","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2038"},"modified":"2019-04-01T04:07:51","modified_gmt":"2019-04-01T11:07:51","slug":"exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/","title":{"rendered":"Explorando o Couchbase e o N1QL por meio do Touchbase usando Node.js e Angular.js - Parte 3: Autentica\u00e7\u00e3o de usu\u00e1rio baseada em sess\u00e3o"},"content":{"rendered":"<h2>Parte 3: Modelos de login e sess\u00e3o<\/h2>\n<p>At\u00e9 o momento, <a href=\"\/blog\/pt\/touchbase-part-0-creating-a-data-model\/\">Parte 0<\/a> e <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-1-creating-a-user-document\/\">Parte 1<\/a> abrangem o modelo de dados e o documento do usu\u00e1rio usado no aplicativo, seguido de <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-2-email-verification\/\">Parte 2<\/a> em que verificamos as contas por e-mail usando o Nodemailer e o Sendgrid. Essa \u00e9 uma parte essencial para iniciar um usu\u00e1rio em qualquer site de m\u00eddia social, mas agora precisamos garantir que ele possa fazer login e acessar o conte\u00fado da nossa rede social. Vamos come\u00e7ar!<\/p>\n<h4>Materiais necess\u00e1rios:<\/h4>\n<ul>\n<li>Node.js<\/li>\n<li>Expresso<\/li>\n<\/ul>\n<h4>M\u00f3dulos de n\u00f3 usados:<\/h4>\n<ul>\n<li>SDK do Couchbase Node.js com N1QL<\/li>\n<li>analisador de corpo<\/li>\n<li>uuid<\/li>\n<\/ul>\n<p>Primeiro, precisamos autenticar nossos usu\u00e1rios. O ponto de extremidade da API para isso \u00e9 <strong>'\/api\/loginAuth'<\/strong>.<\/p>\n<h4>API '\/api\/loginAuth<\/h4>\n<p><script src=\"https:\/\/gist.github.com\/pranavmayuram\/c2d18da0dd6075152f69.js\"><\/script><\/p>\n<p>A autentica\u00e7\u00e3o come\u00e7a com a garantia de que o e-mail e a senha sejam transmitidos corretamente para o back-end. Se eles estiverem faltando, ser\u00e1 retornado um erro. Na implementa\u00e7\u00e3o atual dessa API, o erro aparece no front-end com um erro Angular.js, ng-messages. Observe que tamb\u00e9m enviamos o nome de usu\u00e1rio e a senha para esse endpoint por meio de uma solicita\u00e7\u00e3o POST. Isso garante um pouco mais de seguran\u00e7a em rela\u00e7\u00e3o a um GET, j\u00e1 que a URL n\u00e3o exp\u00f5e informa\u00e7\u00f5es secretas. Obviamente, uma implanta\u00e7\u00e3o adequada do aplicativo deve incluir HTTPS para evitar ataques do tipo man-in-the-middle.<\/p>\n<p>Ap\u00f3s a primeira valida\u00e7\u00e3o, o <strong>'User.advancedSearch'<\/strong> \u00e9 executada para encontrar o documento do endere\u00e7o de e-mail que o usu\u00e1rio est\u00e1 procurando. O ideal \u00e9 que a fun\u00e7\u00e3o retorne um resultado com o endere\u00e7o de e-mail exato que o usu\u00e1rio possui. Como voc\u00ea pode ver, o primeiro trecho de c\u00f3digo da API loginAuth, <strong>'if (x.length === 0)'<\/strong>Em seguida, ele verifica se o endere\u00e7o de e-mail foi registrado e, se n\u00e3o tiver sido, gera um erro. Em segundo lugar, ele verifica se a combina\u00e7\u00e3o de nome de usu\u00e1rio e senha \u00e9 v\u00e1lida, chamando a fun\u00e7\u00e3o <strong>'User.validatePassword'<\/strong> que garante que a vers\u00e3o com hash da senha inserida pelo usu\u00e1rio corresponda \u00e0 vers\u00e3o com hash que foi armazenada no documento do usu\u00e1rio. Isso usa a mesma fun\u00e7\u00e3o de hash que usamos no documento original do usu\u00e1rio que criamos no <strong>'User.create'<\/strong> fun\u00e7\u00e3o.<\/p>\n<h4>Fun\u00e7\u00e3o User.validatePassword<\/h4>\n<p><script src=\"https:\/\/gist.github.com\/pranavmayuram\/46c77b8d1ce969fbcf61.js\"><\/script><\/p>\n<p>Em seguida, ele verifica se o e-mail do usu\u00e1rio foi verificado. Se voc\u00ea n\u00e3o tiver certeza de como isso funciona, consulte <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-2-email-verification\/\">Parte 2<\/a> desta s\u00e9rie. Em resumo, h\u00e1 um atributo 'login.emailVerified' que seria alterado se o usu\u00e1rio realmente verificasse seu e-mail. Esse \u00e9 um atributo booleano, portanto, verificamos se ele \u00e9 avaliado como \"true\" e, caso contr\u00e1rio, lan\u00e7amos uma mensagem de erro para informar ao usu\u00e1rio que seu e-mail ainda n\u00e3o foi verificado.<\/p>\n<p>Por fim, se todas as condi\u00e7\u00f5es acima forem atendidas, passaremos ao processo de realmente fazer o login do usu\u00e1rio. Isso inclui adicionar a hora atual \u00e0 matriz, 'timeTracker.loginTimes', no documento correto do usu\u00e1rio. Isso \u00e9 feito usando a fun\u00e7\u00e3o <strong>Usu\u00e1rio.addLoginTime<\/strong> que est\u00e1 em <strong>models\/usermodel.js<\/strong>.<\/p>\n<h4>Fun\u00e7\u00e3o User.addLoginTime<\/h4>\n<p><script src=\"https:\/\/gist.github.com\/pranavmayuram\/820b498990b2291c4ce1.js\"><\/script><\/p>\n<p>Essa fun\u00e7\u00e3o usa uma consulta N1QL para pegar a matriz do usu\u00e1rio e, essencialmente, defini-la como a mesma matriz, mas com a hora atual anexada \u00e0 matriz 'timeTracker.loginTimes'. No momento, n\u00e3o h\u00e1 como acrescentar algo a uma matriz existente usando N1QL, portanto, essa \u00e9 uma solu\u00e7\u00e3o alternativa a ser usada at\u00e9 que essa funcionalidade seja adicionada. O <strong>ATUALIZA\u00c7\u00c3O<\/strong> garante que a chave que estamos procurando j\u00e1 existe e que estamos apenas atualizando um array existente.<\/p>\n<p><strong>OBSERVA\u00c7\u00c3O:<\/strong> Certifique-se sempre de usar o <strong>USAR CHAVES<\/strong> sempre que voc\u00ea quiser pesquisar um ID de documento espec\u00edfico. Usando <strong>'WHERE META(bucketname).id=var'<\/strong> ou qualquer outro <strong>ONDE<\/strong> n\u00e3o usa a interface K-V super r\u00e1pida para o Couchbase e pode ser inconsistente com suas altera\u00e7\u00f5es. Neste exemplo, usamos <strong>USAR CHAVES<\/strong> para a velocidade e passar todas as nossas novas vari\u00e1veis em uma matriz para o SDK do Node.js usar na consulta. Isso garante que a consulta ser\u00e1 mais segura e evitar\u00e1 a inje\u00e7\u00e3o de N1QL, semelhante \u00e0 inje\u00e7\u00e3o de SQL. Os pontos em que esses elementos da matriz ser\u00e3o colocados na consulta s\u00e3o indicados com um \"$\". O n\u00famero inteiro especificado ao lado do s\u00edmbolo '$' especifica qual elemento da matriz ser\u00e1 usado. A indexa\u00e7\u00e3o para isso come\u00e7a em 1.<\/p>\n<p>Ap\u00f3s a execu\u00e7\u00e3o bem-sucedida, podemos voltar para <strong>rotas\/routes.js<\/strong> para nosso ponto de extremidade da API e veja o <strong>'Session.create'<\/strong> que ser\u00e1 executada em seguida. Aqui, chegamos ao in\u00edcio da cria\u00e7\u00e3o de um aplicativo mais seguro. Usando <strong>'Session.create'<\/strong>passamos o ID do usu\u00e1rio, como fizemos na \u00faltima fun\u00e7\u00e3o. Isso pode ser encontrado em <strong>models\/sessionmodel.js<\/strong>.<\/p>\n<h4>Fun\u00e7\u00e3o Session.create<\/h4>\n<p><script src=\"https:\/\/gist.github.com\/pranavmayuram\/f6f07a6058114a98d44e.js\"><\/script><\/p>\n<p>Essa fun\u00e7\u00e3o usa o ID do usu\u00e1rio e gera um documento de sess\u00e3o que tem seu pr\u00f3prio identificador exclusivo, sessionID, e tamb\u00e9m o ID do usu\u00e1rio associado, para que ele possa ser identificado. O campo \"userID\" \u00e9 \u00fatil para quando quisermos criar uma p\u00e1gina \"My Profile\" ou identificar quem pode ter feito uma determinada publica\u00e7\u00e3o em nossa rede social. Usamos uma inser\u00e7\u00e3o simples do SDK do Couchbase para adicionar esse documento. Em seguida, adicionamos uma expira\u00e7\u00e3o ao documento para que ele expire uma hora ap\u00f3s ser adicionado (3600 milissegundos). Depois que um usu\u00e1rio estiver conectado por mais de uma hora, ele ter\u00e1 que fazer login novamente. Um poss\u00edvel aprimoramento aqui pode ser usar a fun\u00e7\u00e3o <strong>touch()<\/strong> para estender a sess\u00e3o enquanto estiver em uso. Depois que esse documento \u00e9 criado, enviamos um retorno de chamada com o sessionModel e, em seguida, em nosso <strong>rotas\/routes.js<\/strong> enviamos um objeto com o sessionID e a expira\u00e7\u00e3o para o front-end. Aqui, esse sessionID ser\u00e1 armazenado no localStorage do navegador, para que possa ser acessado sempre que necess\u00e1rio.<\/p>\n<p>Depois que o sessionID \u00e9 adicionado ao localStorage, n\u00f3s o enviamos no cabe\u00e7alho das solicita\u00e7\u00f5es HTTP para qualquer rota protegida. Uma rota protegida seria qualquer endpoint de API que tenha informa\u00e7\u00f5es seguras que s\u00f3 devem ser acessadas por usu\u00e1rios que estejam conectados no momento. Para este projeto, usei o Angular.js, ent\u00e3o coloquei o sessionID do localStorage no cabe\u00e7alho $http de cada solicita\u00e7\u00e3o de API, que pode ser visto no arquivo <strong>'$scope.getAllUsers'<\/strong> fun\u00e7\u00e3o.<\/p>\n<h4>Fun\u00e7\u00e3o de front-end $scope.getAllUsers<\/h4>\n<p><script src=\"https:\/\/gist.github.com\/pranavmayuram\/24e637e3e744b6ae7a76.js\"><\/script><\/p>\n<p>O <strong>'\/api\/advancedSearch'<\/strong> \u00e9 um exemplo de uma rota protegida e \u00e9 atingida pela <strong>'$scope.getAllUsers'<\/strong> fun\u00e7\u00e3o. No c\u00f3digo da fun\u00e7\u00e3o <strong>'\/api\/advancedSearch'<\/strong> e voc\u00ea perceber\u00e1 que ele chama <strong>'Session.auth'<\/strong>e, em seguida, um retorno de chamada nos argumentos da fun\u00e7\u00e3o.<\/p>\n<h4>API '\/api\/advancedSearch<\/h4>\n<p><script src=\"https:\/\/gist.github.com\/pranavmayuram\/6c30261d0b3a02e346b5.js\"><\/script><\/p>\n<p>O <strong>'Session.auth'<\/strong> fun\u00e7\u00e3o em <strong>models\/sessionmodel.js<\/strong> obt\u00e9m o sessionID do cabe\u00e7alho da solicita\u00e7\u00e3o, fazendo uma opera\u00e7\u00e3o de divis\u00e3o no cabe\u00e7alho $http para analis\u00e1-lo. O sessionID pode estar nas inst\u00e2ncias do corpo da solicita\u00e7\u00e3o, como o upload de imagens, de modo que isso \u00e9 tratado no <strong>'Session.auth'<\/strong> tamb\u00e9m. Depois que o sessionID \u00e9 obtido do cabe\u00e7alho ou de alguma outra parte da solicita\u00e7\u00e3o, \u00e9 realizada uma consulta N1QL para encontrar o documento da sess\u00e3o. Novamente, <strong>'USE KEYS' (USAR CHAVES)<\/strong> \u00e9 usado para manter a velocidade em mente. Caso nenhum documento seja encontrado com o sessionID que passamos, o que provavelmente significa que ele expirou ap\u00f3s uma hora, uma resposta \u00e9 enviada com um objeto. Isso pode ser tratado de v\u00e1rias maneiras diferentes no front-end e, na minha implementa\u00e7\u00e3o, eu simplesmente envio o usu\u00e1rio de volta \u00e0 p\u00e1gina de login <strong>Se ('!currentSession')<\/strong>.<\/p>\n<h4>Fun\u00e7\u00e3o Session.auth<\/h4>\n<p><script src=\"https:\/\/gist.github.com\/pranavmayuram\/ee20714cfb36daf16385.js\"><\/script><\/p>\n<p>Essa seguran\u00e7a baseada em sess\u00e3o mant\u00e9m o site seguro, pois todo o controle de acesso \u00e9 verificado no back-end. Ao contr\u00e1rio de um cookie simples, em que o usu\u00e1rio \u00e9 desconectado se o cookie expirar, isso d\u00e1 ao desenvolvedor controle total sobre o login. O uso puro e simples de cookies expirados permite que o javascript do front-end seja facilmente exclu\u00eddo ou alterado para obter acesso \u00e0s informa\u00e7\u00f5es do site. O motivo pelo qual o <strong>'\/api\/loginAuth'<\/strong> tamb\u00e9m passa a expira\u00e7\u00e3o do documento da sess\u00e3o para o front-end para permitir que outros desenvolvedores adicionem cookies com expira\u00e7\u00e3o no front-end, se desejarem.<\/p>\n<p>Se o <strong>'Session.auth'<\/strong> for bem-sucedida e encontrar o documento correto, ela passar\u00e1 o ID de usu\u00e1rio do documento para o objeto de solicita\u00e7\u00e3o, que poder\u00e1 ser acessado por qualquer outra fun\u00e7\u00e3o no ponto de extremidade da API para receber informa\u00e7\u00f5es espec\u00edficas do usu\u00e1rio para coisas como \"Meu perfil\" ou armazenar o ID do usu\u00e1rio em documentos para suas postagens.<\/p>\n<p>Isso conclui nosso quarto tutorial sobre o Touchbase, e espero que tenha sido \u00fatil para entender um m\u00e9todo de manter um aplicativo seguro. H\u00e1 outras alternativas, como tokens da Web JSON ou OAuth 2.0, mas, neste caso, escolhi uma abordagem baseada em sess\u00e3o e espero que isso o ajude a entender esse m\u00e9todo de autentica\u00e7\u00e3o de usu\u00e1rio. Se voc\u00ea tiver alguma d\u00favida, coment\u00e1rio ou feedback, comente abaixo.<\/p>","protected":false},"excerpt":{"rendered":"<p>Part 3: Login and Session models So far, Part 0 and Part 1 cover the data model and user document used in the application followed by Part 2 where we verify accounts through email using Nodemailer and Sendgrid. These are [&hellip;]<\/p>","protected":false},"author":60,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[9034],"class_list":["post-2038","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Session-based User Authentication - The Couchbase Blog<\/title>\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\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 3: Session-based User Authentication\" \/>\n<meta property=\"og:description\" content=\"Part 3: Login and Session models So far, Part 0 and Part 1 cover the data model and user document used in the application followed by Part 2 where we verify accounts through email using Nodemailer and Sendgrid. These are [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-12-08T22:18:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-04-01T11:07:51+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Pranav Mayuram\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Pranav Mayuram\" \/>\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\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/\"},\"author\":{\"name\":\"Pranav Mayuram\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/454261061bad5159ad2696e0bf162eaa\"},\"headline\":\"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 3: Session-based User Authentication\",\"datePublished\":\"2015-12-08T22:18:56+00:00\",\"dateModified\":\"2019-04-01T11:07:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/\"},\"wordCount\":1438,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/\",\"name\":\"Session-based User Authentication - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-12-08T22:18:56+00:00\",\"dateModified\":\"2019-04-01T11:07:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#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\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 3: Session-based User Authentication\"}]},{\"@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\/454261061bad5159ad2696e0bf162eaa\",\"name\":\"Pranav Mayuram\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/61baa4ff0f18aa9a8ce672f0f97f1ac0\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/de8b1b457fdc2f5f8b407ef8bf0bfcacb1e2be0ab9de2cee8e8aa4ee7f985709?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/de8b1b457fdc2f5f8b407ef8bf0bfcacb1e2be0ab9de2cee8e8aa4ee7f985709?s=96&d=mm&r=g\",\"caption\":\"Pranav Mayuram\"},\"description\":\"Pranav Mayuram is a N1QL Query language intern, Couchbase. Built a social network platform, Touchbase, using Couchbase Server, Node.js, Express &amp; Angular.js.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/pranav-mayuram\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Session-based User Authentication - The Couchbase Blog","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\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/","og_locale":"pt_BR","og_type":"article","og_title":"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 3: Session-based User Authentication","og_description":"Part 3: Login and Session models So far, Part 0 and Part 1 cover the data model and user document used in the application followed by Part 2 where we verify accounts through email using Nodemailer and Sendgrid. These are [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-12-08T22:18:56+00:00","article_modified_time":"2019-04-01T11:07:51+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Pranav Mayuram","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Pranav Mayuram","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/"},"author":{"name":"Pranav Mayuram","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/454261061bad5159ad2696e0bf162eaa"},"headline":"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 3: Session-based User Authentication","datePublished":"2015-12-08T22:18:56+00:00","dateModified":"2019-04-01T11:07:51+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/"},"wordCount":1438,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/","url":"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/","name":"Session-based User Authentication - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-12-08T22:18:56+00:00","dateModified":"2019-04-01T11:07:51+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#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\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 3: Session-based User Authentication"}]},{"@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\/454261061bad5159ad2696e0bf162eaa","name":"Pranav Mayuram","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/61baa4ff0f18aa9a8ce672f0f97f1ac0","url":"https:\/\/secure.gravatar.com\/avatar\/de8b1b457fdc2f5f8b407ef8bf0bfcacb1e2be0ab9de2cee8e8aa4ee7f985709?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/de8b1b457fdc2f5f8b407ef8bf0bfcacb1e2be0ab9de2cee8e8aa4ee7f985709?s=96&d=mm&r=g","caption":"Pranav Mayuram"},"description":"Pranav Mayuram \u00e9 estagi\u00e1rio da linguagem de consulta N1QL, Couchbase. Criou uma plataforma de rede social, Touchbase, usando o Couchbase Server, Node.js, Express e Angular.js.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/pranav-mayuram\/"}]}},"authors":[{"term_id":9034,"user_id":60,"is_guest":0,"slug":"pranav-mayuram","display_name":"Pranav Mayuram","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/de8b1b457fdc2f5f8b407ef8bf0bfcacb1e2be0ab9de2cee8e8aa4ee7f985709?s=96&d=mm&r=g","author_category":"","last_name":"Mayuram","first_name":"Pranav","job_title":"","user_url":"","description":"Pranav Mayuram \u00e9 estagi\u00e1rio da linguagem de consulta N1QL, Couchbase. Criou uma plataforma de rede social, Touchbase, usando o Couchbase Server, Node.js, Express e Angular.js."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2038","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\/60"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2038"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2038\/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=2038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2038"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}