{"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\/es\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/","title":{"rendered":"Explorando Couchbase y N1QL a trav\u00e9s de Touchbase usando Node.js y Angular.js - Parte 3: Autenticaci\u00f3n de usuario basada en sesi\u00f3n"},"content":{"rendered":"<h2>Parte 3: Modelos de inicio de sesi\u00f3n<\/h2>\n<p>Hasta ahora, <a href=\"\/blog\/es\/touchbase-part-0-creating-a-data-model\/\">Parte 0<\/a> y <a href=\"https:\/\/www.couchbase.com\/blog\/es\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-1-creating-a-user-document\/\">Parte 1<\/a> cubren el modelo de datos y el documento de usuario utilizados en la aplicaci\u00f3n, seguidos de <a href=\"https:\/\/www.couchbase.com\/blog\/es\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-2-email-verification\/\">Parte 2<\/a> donde verificamos las cuentas a trav\u00e9s del correo electr\u00f3nico utilizando Nodemailer y Sendgrid. Estas son una parte fundamental para conseguir que un usuario se inicie en cualquier sitio web de medios sociales, pero ahora debemos asegurarnos de que pueden iniciar sesi\u00f3n y acceder al contenido en nuestra red social. \u00a1Vamos a empezar!<\/p>\n<h4>Materiales necesarios:<\/h4>\n<ul>\n<li>Node.js<\/li>\n<li>Express<\/li>\n<\/ul>\n<h4>M\u00f3dulos de nodo utilizados:<\/h4>\n<ul>\n<li>SDK de Couchbase Node.js con N1QL<\/li>\n<li>body-parser<\/li>\n<li>uuid<\/li>\n<\/ul>\n<p>Primero tenemos que autenticar a nuestros usuarios. El punto final de la API para ello es <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>La autenticaci\u00f3n comienza asegur\u00e1ndose de que tanto el correo electr\u00f3nico como la contrase\u00f1a se pasan correctamente al back-end. Si faltan, se devolver\u00e1 un error. En la implementaci\u00f3n actual de esta API, el error se muestra en el front-end con un error Angular.js, ng-messages. Tenga en cuenta que tambi\u00e9n enviamos el nombre de usuario y la contrase\u00f1a a este punto final a trav\u00e9s de una solicitud POST. Esto garantiza un poco m\u00e1s de seguridad que un GET, ya que la URL no expondr\u00e1 informaci\u00f3n secreta. Por supuesto, un despliegue adecuado de la aplicaci\u00f3n deber\u00eda incluir HTTPS para evitar ataques man-in-the-middle.<\/p>\n<p>Tras la primera validaci\u00f3n, el <strong>User.advancedSearch<\/strong> se ejecuta para encontrar el documento de la direcci\u00f3n de correo electr\u00f3nico que el usuario est\u00e1 buscando. Lo ideal es que la funci\u00f3n devuelva como resultado la direcci\u00f3n de correo electr\u00f3nico exacta que tiene el usuario. Como se puede ver, el primer fragmento de c\u00f3digo de la API loginAuth, <strong>'if (x.length === 0)'<\/strong>En primer lugar, comprueba si la direcci\u00f3n de correo electr\u00f3nico est\u00e1 registrada y, en caso contrario, emite un mensaje de error. En segundo lugar, comprueba que la combinaci\u00f3n de nombre de usuario y contrase\u00f1a es v\u00e1lida, llamando a la funci\u00f3n <strong>User.validatePassword<\/strong> que se asegura de que la versi\u00f3n hash de la contrase\u00f1a introducida por el usuario coincide con la versi\u00f3n hash almacenada en el documento del usuario. Esto utiliza la misma funci\u00f3n hash que utilizamos en el documento de usuario original que creamos en la secci\u00f3n <strong>'Usuario.crear'<\/strong> funci\u00f3n.<\/p>\n<h4>Funci\u00f3n User.validatePassword<\/h4>\n<p><script src=\"https:\/\/gist.github.com\/pranavmayuram\/46c77b8d1ce969fbcf61.js\"><\/script><\/p>\n<p>A continuaci\u00f3n, comprueba que el correo electr\u00f3nico del usuario est\u00e1 verificado. Si no est\u00e1 seguro de c\u00f3mo funciona esto, consulte <a href=\"https:\/\/www.couchbase.com\/blog\/es\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-2-email-verification\/\">parte 2<\/a> de esta serie. En resumen, hay un atributo 'login.emailVerified' que cambiar\u00eda si el usuario verifica su correo electr\u00f3nico. Este es un atributo booleano, por lo que comprobamos para asegurarnos de que se eval\u00faa como 'true', y si no lanzamos un mensaje de error para decirle al usuario que su correo electr\u00f3nico a\u00fan no est\u00e1 verificado.<\/p>\n<p>Por \u00faltimo, si se cumplen todas las condiciones anteriores, pasamos al proceso de inicio de sesi\u00f3n del usuario. Esto incluye a\u00f1adir la hora actual al array, 'timeTracker.loginTimes', en el documento de usuario correcto. Para ello se utiliza el m\u00e9todo <strong>Usuario.addLoginTime<\/strong> que se encuentra en <strong>models\/usermodel.js<\/strong>.<\/p>\n<h4>Funci\u00f3n User.addLoginTime<\/h4>\n<p><script src=\"https:\/\/gist.github.com\/pranavmayuram\/820b498990b2291c4ce1.js\"><\/script><\/p>\n<p>Esta funci\u00f3n usa una consulta N1QL para tomar el array del usuario y esencialmente igualarlo al mismo array, pero con la hora actual a\u00f1adida al array 'timeTracker.loginTimes'. Actualmente no hay forma de a\u00f1adir algo a un array existente usando N1QL, as\u00ed que esta es una soluci\u00f3n alternativa hasta que se a\u00f1ada esa funcionalidad. El <strong>ACTUALIZACI\u00d3N<\/strong> garantiza que la clave que buscamos ya existe y que s\u00f3lo estamos actualizando una matriz existente.<\/p>\n<p><strong>NOTA:<\/strong> Aseg\u00farese siempre de utilizar el <strong>UTILIZAR TECLAS<\/strong> siempre que desee buscar un ID de documento espec\u00edfico. Utilizaci\u00f3n de <strong>WHERE META(nombrecubo).id=var'<\/strong> o cualquier otro <strong>DONDE<\/strong> no utiliza la super r\u00e1pida interfaz K-V a Couchbase y puede ser inconsistente con tus cambios. En este ejemplo usamos <strong>UTILIZAR TECLAS<\/strong> para la velocidad y pasar todas nuestras nuevas variables en un array al SDK de Node.js para que lo utilice en la consulta. Esto asegura que la consulta ser\u00e1 m\u00e1s segura y evitar\u00e1 la inyecci\u00f3n N1QL, similar a la inyecci\u00f3n SQL. Los lugares donde se colocar\u00e1n estos elementos del array en la consulta se indican con un '$'. El entero especificado junto al sybmol '$' especifica qu\u00e9 elemento del array se utilizar\u00e1. La indexaci\u00f3n comienza en 1.<\/p>\n<p>Una vez ejecutado con \u00e9xito, podemos volver a <strong>rutas\/routes.js<\/strong> a nuestro punto final de la API y mire el <strong>Sesi\u00f3n.crear<\/strong> que se ejecutar\u00e1 a continuaci\u00f3n. Aqu\u00ed, llegamos al principio de la creaci\u00f3n de una aplicaci\u00f3n m\u00e1s segura. Usando <strong>Sesi\u00f3n.crear<\/strong>pasamos el ID del usuario, como hicimos en la \u00faltima funci\u00f3n. Esto se puede encontrar en <strong>modelos\/sessionmodel.js<\/strong>.<\/p>\n<h4>Funci\u00f3n session.create<\/h4>\n<p><script src=\"https:\/\/gist.github.com\/pranavmayuram\/f6f07a6058114a98d44e.js\"><\/script><\/p>\n<p>Esta funci\u00f3n toma el ID de usuario y genera un documento de sesi\u00f3n que tiene su propio identificador \u00fanico, sessionID, y tambi\u00e9n el ID de usuario del usuario asociado, para poder identificarlo. El campo 'userID' es \u00fatil para cuando queramos crear una p\u00e1gina de 'Mi Perfil', o identificar qui\u00e9n puede haber hecho un determinado post en nuestra red social. Usamos una simple inserci\u00f3n del SDK de Couchbase para a\u00f1adir este documento. Luego a\u00f1adimos una expiraci\u00f3n al documento para que expire una hora despu\u00e9s de ser a\u00f1adido (3600 milisegundos). Despu\u00e9s de que un usuario est\u00e9 conectado durante m\u00e1s de una hora, tendr\u00e1 que conectarse de nuevo. Una posible mejora aqu\u00ed podr\u00eda ser utilizar la funci\u00f3n <strong>tocar()<\/strong> para extender la sesi\u00f3n mientras est\u00e1 en uso. Una vez creado este documento, enviamos un callback con el sessionModel, y luego en nuestro <strong>rutas\/routes.js<\/strong> enviamos un objeto con el identificador de sesi\u00f3n y la fecha de caducidad al front-end. Aqu\u00ed este sessionID se almacenar\u00e1 en el localStorage del navegador, para poder acceder a \u00e9l siempre que sea necesario.<\/p>\n<p>Despu\u00e9s de a\u00f1adir el sessionID al localStorage, lo enviamos en la cabecera de las peticiones HTTP para cualquier ruta protegida. Una ruta protegida ser\u00eda cualquier punto final de la API que tenga informaci\u00f3n segura a la que s\u00f3lo deber\u00edan acceder los usuarios que hayan iniciado sesi\u00f3n. Para este proyecto utilic\u00e9 Angular.js, as\u00ed que puse el sessionID de localStorage en el encabezado $http para cada solicitud de API, que se puede ver en el archivo <strong>$scope.getAllUsers<\/strong> funci\u00f3n.<\/p>\n<h4>Funci\u00f3n front-end $scope.getAllUsers<\/h4>\n<p><script src=\"https:\/\/gist.github.com\/pranavmayuram\/24e637e3e744b6ae7a76.js\"><\/script><\/p>\n<p>En <strong>\/api\/advancedSearch<\/strong> es un ejemplo de ruta protegida, y se ve afectada por lo anterior <strong>$scope.getAllUsers<\/strong> funci\u00f3n. En el c\u00f3digo de la funci\u00f3n <strong>\/api\/advancedSearch<\/strong> y observar\u00e1 que llama a <strong>Sesi\u00f3n.auth<\/strong>y luego un callback en los argumentos de la funci\u00f3n.<\/p>\n<h4>API \"\/api\/advancedSearch<\/h4>\n<p><script src=\"https:\/\/gist.github.com\/pranavmayuram\/6c30261d0b3a02e346b5.js\"><\/script><\/p>\n<p>En <strong>Sesi\u00f3n.auth<\/strong> funci\u00f3n en <strong>modelos\/sessionmodel.js<\/strong> toma el sessionID de la cabecera de la petici\u00f3n, haciendo una operaci\u00f3n de divisi\u00f3n en la cabecera $http para analizarla. El identificador de sesi\u00f3n puede estar en el cuerpo de la petici\u00f3n, como en el caso de la subida de im\u00e1genes, que se gestiona en el comando <strong>Sesi\u00f3n.auth<\/strong> tambi\u00e9n. Una vez que el sessionID se toma de la cabecera, o de alguna otra parte de la petici\u00f3n, entonces se realiza una consulta N1QL para encontrar el documento de sesi\u00f3n. De nuevo, <strong>UTILIZAR LLAVES<\/strong> se utiliza para mantener la velocidad en mente. En el caso de que no se encuentre ning\u00fan documento con el sessionID que pasamos, lo que probablemente significa que ha expirado despu\u00e9s de una hora, entonces se env\u00eda una respuesta con un objeto. Esto puede ser manejado de muchas maneras diferentes en el front-end, y en mi implementaci\u00f3n, simplemente env\u00edo al usuario de vuelta a la p\u00e1gina de login <strong>si ('!currentSession')<\/strong>.<\/p>\n<h4>Funci\u00f3n session.auth<\/h4>\n<p><script src=\"https:\/\/gist.github.com\/pranavmayuram\/ee20714cfb36daf16385.js\"><\/script><\/p>\n<p>Esta seguridad basada en la sesi\u00f3n mantiene el sitio web seguro, ya que todo el control de acceso se verifica en el back-end. A diferencia de una simple cookie, donde el usuario se desconecta si la cookie expira, esto da al desarrollador un control total sobre el inicio de sesi\u00f3n. El mero uso de cookies que caducan permite que el javascript del front-end sea f\u00e1cilmente borrado o alterado para obtener acceso a la informaci\u00f3n del sitio. La raz\u00f3n por la que las <strong>\/api\/loginAuth<\/strong> tambi\u00e9n pasa la caducidad del documento de sesi\u00f3n al front-end es para permitir a otros desarrolladores a\u00f1adir potencialmente cookies que caducan en el front-end si lo desean.<\/p>\n<p>Si el <strong>Sesi\u00f3n.auth<\/strong> tiene \u00e9xito y encuentra el documento correcto, pasa el ID de usuario del documento al objeto de solicitud, y cualquier otra funci\u00f3n del punto final de la API puede acceder a \u00e9l para recibir informaci\u00f3n espec\u00edfica del usuario para cosas como \"Mi perfil\", o almacenar el ID del usuario en documentos para sus publicaciones.<\/p>\n<p>Con esto concluye nuestro cuarto tutorial sobre Touchbase, y espero que haya sido \u00fatil para entender un m\u00e9todo de mantener una aplicaci\u00f3n segura. Hay otras alternativas como los tokens web JSON, o OAuth 2.0, pero en este caso eleg\u00ed un enfoque basado en sesiones y espero que te ayude a entender este m\u00e9todo de autenticaci\u00f3n de usuarios. Si tienes alguna pregunta, comentario u opini\u00f3n, por favor comenta abajo.<\/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 v26.0 (Yoast SEO v26.0) - 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\/es\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\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\/es\/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\":\"es\",\"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\":\"es\",\"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\":\"es\",\"@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\":\"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\/454261061bad5159ad2696e0bf162eaa\",\"name\":\"Pranav Mayuram\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\/es\/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\/es\/exploring-couchbase-and-n1ql-through-touchbase-using-node-js-and-angular-js-part-3-session-based-user-authentication\/","og_locale":"es_MX","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\/es\/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":"es","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":"es","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":"es","@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":"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\/454261061bad5159ad2696e0bf162eaa","name":"Pranav Mayuram","image":{"@type":"ImageObject","inLanguage":"es","@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 es pasante de lenguaje de consulta N1QL, Couchbase. Construy\u00f3 una plataforma de red social, Touchbase, usando Couchbase Server, Node.js, Express &amp; Angular.js.","url":"https:\/\/www.couchbase.com\/blog\/es\/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 es pasante de lenguaje de consulta N1QL, Couchbase. Construy\u00f3 una plataforma de red social, Touchbase, usando Couchbase Server, Node.js, Express &amp; Angular.js."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2038","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\/60"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2038"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2038\/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=2038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2038"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}