{"id":1987,"date":"2015-12-16T01:06:40","date_gmt":"2015-12-16T01:06:39","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1987"},"modified":"2019-01-02T06:19:31","modified_gmt":"2019-01-02T14:19:31","slug":"adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/","title":{"rendered":"A\u00f1adir Google Sign-In con Node.js a una aplicaci\u00f3n Couchbase Mobile"},"content":{"rendered":"<p>El uso de las API de OAuth proporcionadas por aplicaciones de terceros, como Google+, para iniciar sesi\u00f3n en tu aplicaci\u00f3n m\u00f3vil puede ofrecer a los usuarios una primera experiencia agradable. Pueden iniciar sesi\u00f3n con una cuenta que ya conocen y en la que conf\u00edan y rellenar su perfil con los datos que introdujeron en Google+. En este tutorial, usted aprender\u00e1 c\u00f3mo:<\/p>\n<ul>\n<li>Escribe una aplicaci\u00f3n Node.js para gestionar la autenticaci\u00f3n con Sync Gateway.<\/li>\n<li>Utiliza la API REST de Couchbase Sync Gateway Admin para crear usuarios y sesiones.<\/li>\n<li>Integrar Google Sign-In en una aplicaci\u00f3n iOS escrita con Swift 2.<\/li>\n<li>Cree una aplicaci\u00f3n iOS sencilla en Swift para probar el nuevo punto final de inicio de sesi\u00f3n y replicar algunos documentos.<\/li>\n<\/ul>\n<p>El proyecto final puede consultarse en <a href=\"https:\/\/github.com\/couchbaselabs\/mini-hacks\/tree\/master\/google-sign-in\">GitHub<\/a>.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2015\/october\/adding-google-sign-in-with-node.js-to-a-couchbase-mobile-application\/thumbnail.png\" \/><\/p>\n<h2>\u00a0Requisitos previos<\/h2>\n<p>Los requisitos previos para este tutorial son:<\/p>\n<ul>\n<li>Node.js<\/li>\n<li>Xcode 7+ (utilizar\u00e1s Swift 2 para crear la aplicaci\u00f3n de ejemplo)<\/li>\n<\/ul>\n<h2>Primeros pasos<\/h2>\n<p>Descargue Sync Gateway desde el siguiente enlace y descomprima el archivo:<\/p>\n<p>https:\/\/www.couchbase.com\/nosql-databases\/downloads<\/p>\n<p>En un nuevo archivo llamado <strong>sync-gateway-config.json<\/strong>pegue lo siguiente:<\/p>\n<pre><code class=\"language-javascript\">{\r\n  \"log\": [\"*\"],\r\n  \"databases\": {\r\n    \"simple-login\": {\r\n      \"server\": \"walrus:\",\r\n      \"users\": { \"GUEST\": { \"disabled\": true } },\r\n      \"sync\": `\r\n        function(doc, oldDoc) {\r\n          channel(doc._id);\r\n          access(doc.user_id, doc._id);\r\n        }\r\n      `\r\n    }\r\n  }\r\n}<\/code><\/pre>\n<p>En este archivo de configuraci\u00f3n, est\u00e1 creando una base de datos llamada <strong>simple-login<\/strong> y utilizando la funci\u00f3n de sincronizaci\u00f3n para asignar cada documento a un canal diferente y conceder a un usuario acceso al canal (el nombre de usuario se almacena en el archivo <code>usuario_id<\/code> del documento).<\/p>\n<p>Inicie Sync Gateway con el siguiente comando:<\/p>\n<pre><code class=\"language-bash\">$ ~\/Downloads\/couchbase-sync-gateway\/bin\/sync_gateway sync-gateway-config.json<\/code><\/pre>\n<h2>Proxy inverso para Sync Gateway<\/h2>\n<p>Con Sync Gateway en funcionamiento, podr\u00e1 centrarse en crear el servidor de aplicaciones para gestionar la autenticaci\u00f3n entre Google y Sync Gateway.<\/p>\n<p>Utilizar\u00e1 el popular <a href=\"https:\/\/expressjs.com\/\">Express<\/a> para gestionar la solicitud de creaci\u00f3n de un usuario y el m\u00f3dulo <a href=\"https:\/\/github.com\/request\/request\">solicitar<\/a> para dirigir el resto del tr\u00e1fico a Sync Gateway.<\/p>\n<p>Instala los siguientes m\u00f3dulos de Node.js:<\/p>\n<pre><code class=\"language-bash\">$ npm install express body-parser request --save<\/code><\/pre>\n<p>Cree un nuevo archivo llamado <strong>servidor.js<\/strong> y a\u00f1ade lo siguiente:<\/p>\n<pre><code class=\"language-javascript\">\/\/ 1\r\nvar express = require('express')\r\n  , bodyParser = require('body-parser')\r\n  , request = request('request').defaults({json: true});\r\n\r\n\/\/ 2\r\nvar app = express();\r\napp.use('\/google_signin', bodyParser.json());\r\n\r\napp.post('\/google_signin', function (req, res) {\r\n  \/\/ TODO: handle login request\r\n});\r\n\r\n\/\/ 3\r\napp.all('*', function (req, res) {\r\n  var url = 'https:\/\/0.0.0.0:4984' + req.url;\r\n  req.pipe(request(url)).pipe(res);\r\n});\r\n\r\n\/\/ 4\r\nvar server = app.listen(8000, function () {\r\n  var host = server.address().address;\r\n  var port = server.address().port;\r\n\r\n  console.log('App listening at https:\/\/%s:%s', host, port);\r\n});<\/code><\/pre>\n<p>Estas son las diferentes cosas que suceden:<\/p>\n<ol>\n<li>Requiere el m\u00f3dulo Node.js que instalaste anteriormente.<\/li>\n<li>Instanciar una nueva instancia de express y utilizar la funci\u00f3n <strong>bodyParser<\/strong> middleware s\u00f3lo para el <strong>\/google_signin<\/strong> punto final.<\/li>\n<li>Proxy todas las dem\u00e1s solicitudes a Sync Gateway.<\/li>\n<li>Inicia el servidor web Node.js en el puerto 8000.<\/li>\n<\/ol>\n<p>Inicie el servidor con <code>$ node server.js<\/code> y abrir <code>https:\/\/localhost:8000<\/code> en su navegador. Deber\u00eda ver el mensaje de bienvenida de Sync Gateway:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2015\/october\/adding-google-sign-in-with-node.js-to-a-couchbase-mobile-application\/server-root.png\" \/><\/p>\n<h3>De Google SignIn a las sesiones de Sync Gateway<\/h3>\n<p>Una vez instalado el proxy inverso, puede a\u00f1adir c\u00f3digo para gestionar la solicitud de inicio de sesi\u00f3n de Google y devolver las credenciales de sesi\u00f3n:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2015\/october\/adding-google-sign-in-with-node.js-to-a-couchbase-mobile-application\/google-sign-in.png\" \/><\/p>\n<p>En este diagrama ocurren varias cosas:<\/p>\n<ul>\n<li><strong>Negro<\/strong> env\u00eda el ID de usuario de Google al servidor de aplicaciones.<\/li>\n<li><strong>Azul<\/strong> comprueba si existe un usuario en Sync Gateway con ese ID de usuario.<\/li>\n<li><strong>Naranja<\/strong> crea el usuario si a\u00fan no existe (normalmente, la primera vez que el usuario inicia sesi\u00f3n con Google en tu aplicaci\u00f3n).<\/li>\n<li><strong>Verde<\/strong> crea una sesi\u00f3n, la respuesta contendr\u00e1 las credenciales de sesi\u00f3n que se pueden pasar a la aplicaci\u00f3n cliente iOS para las r\u00e9plicas push\/pull. Todos los SDKs de Couchbase Lite tienen un m\u00e9todo para especificar las credenciales de sesi\u00f3n que se utilizar\u00e1n en las r\u00e9plicas push\/pull.<\/li>\n<\/ul>\n<p>En el <strong>\/google_signin<\/strong> a\u00f1ada lo siguiente:<\/p>\n<pre><code class=\"language-javascript\">\/** URL of the Sync Gateway instance running locally *\/\r\nvar stringURL = 'https:\/\/0.0.0.0:4985\/simple-login';\r\n\r\n\/** Given the name of a user that exists in Sync Gateway, create a new session *\/\r\nvar sessionRequest = function (name, callback) {\r\nreturn request({\r\n  method: 'POST',\r\n  url: stringURL + '\/_session',\r\n  json: true,\r\n  body: {\r\n    name: name\r\n  }\r\n}, callback);\r\n};\r\n\r\nvar json = req.body;\r\nvar name = json.auth_provider + '-' + json.user_id.toString();\r\nrequest\r\n\/** Check if the user already exists *\/\r\n.get(stringURL + '\/_user\/' + name)\r\n.on('response', function (userExistsResponse) {\r\n  if (userExistsResponse.statusCode === 404) {\r\n    \/** If the user doesn't exist, create one with the Google user ID as the name *\/\r\n    return request\r\n      .put({\r\n        url: stringURL + '\/_user\/' + name,\r\n        json: true,\r\n        body: {\r\n          name: name,\r\n          password: Math.random.toString(36).substr(2)\r\n        }\r\n      })\r\n      .on('response', function (createUserResponse) {\r\n        if (createUserResponse.statusCode === 201) {\r\n          \/** If the user was created successfully, create the session *\/\r\n          sessionRequest(name, function (sessionError, sessionResponse, body) {\r\n            res.send(body);\r\n          });\r\n        }\r\n      });\r\n  }\r\n  \/** The user already exists, simply create a new session *\/\r\n  sessionRequest(name, function (sessionError, sessionResponse, body) {\r\n    res.send(body);\r\n  });\r\n});<\/code><\/pre>\n<p>Reinicia la aplicaci\u00f3n Node.js y ejecuta la siguiente petici\u00f3n curl para dar de alta un nuevo usuario:<\/p>\n<pre><code class=\"language-bash\">$ curl -vX POST \r\n            -H 'Content-Type: application\/json' \r\n            https:\/\/localhost:8000\/google_signin \r\n            -d '{\"user_id\": \"123\", \"auth_provider\": \"google\"}'\r\n\r\n\/\/ Response         \r\n{\r\n    \"session_id\":\"8520c19159a4154abf5fb9b9003ff9677e035929\",\r\n    \"expires\":\"2015-10-13T12:48:05.879325313+01:00\",\r\n    \"cookie_name\":\"SyncGatewaySession\"\r\n}<\/code><\/pre>\n<p>En la siguiente secci\u00f3n, crear\u00e1s una sencilla aplicaci\u00f3n iOS con Swift 2 para utilizar la nueva funcionalidad de tu App Server.<\/p>\n<h2>Swift Time: Pantalla de inicio de sesi\u00f3n sencilla para iOS<\/h2>\n<p>Cambie a Xcode y cree un nuevo proyecto con la etiqueta <strong>Aplicaci\u00f3n de vista \u00fanica<\/strong> plantilla:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2015\/october\/adding-google-sign-in-with-node.js-to-a-couchbase-mobile-application\/xcode-new-project.png\" \/><\/p>\n<p>Usaremos Cocoapods para instalar dependencias en este proyecto. Cierra el proyecto Xcode y desde la l\u00ednea de comandos ejecuta <code>$ pod init<\/code> para migrar su proyecto al uso de Cocoapods. Abra el archivo <strong>Podfile<\/strong> y a\u00f1ade las declaraciones:<\/p>\n<pre><code class=\"language-none\">pod 'Google\/SignIn'\r\npod 'couchbase-lite-ios'<\/code><\/pre>\n<p>Ejecutar <code>Instalaci\u00f3n de la vaina $<\/code> y abra el <strong>SimpleLogin.xcworkspace<\/strong> que se ha generado. A continuaci\u00f3n, a\u00f1adir\u00e1s una cabecera puente para acceder a los SDK de Google SignIn y CouchbaseLite que utilizan Objective-C desde tu c\u00f3digo Swift. En el navegador de proyectos de Xcode, haz clic con el bot\u00f3n derecho en SimpleLogin y selecciona <strong>Nuevo archivo...<\/strong>. Elija la plantilla Header File y ll\u00e1mela <strong>encabezado-puente.h<\/strong>. A\u00f1ada las siguientes sentencias import:<\/p>\n<pre><code class=\"language-objectivec\">#import &lt;Google\/SignIn.h&gt;\r\n#import &lt;CouchbaseLite\/CouchbaseLite.h&gt;<\/code><\/pre>\n<p>Ahora tienes que decirle a Xcode que utilice este archivo. En la ventana <strong>SimpleLogin<\/strong> objetivo, seleccione el <strong>Ajustes de construcci\u00f3n<\/strong> y despl\u00e1cese hasta la pesta\u00f1a <strong>Cabecera puente Objective-C<\/strong>. A\u00f1ade esta ruta de archivo:<\/p>\n<p>SimpleLogin\/bridging-header.h<\/p>\n<h3>Archivo de configuraci\u00f3n de Google Sign-In<\/h3>\n<p>Antes de poder utilizar el SDK de inicio de sesi\u00f3n en tu aplicaci\u00f3n, tendr\u00e1s que crear un nuevo proyecto en Google Developer Console y generar un ID de cliente. Por suerte para nosotros, esto se puede hacer autom\u00e1ticamente con el siguiente enlace:<\/p>\n<p>https:\/\/developers.google.com\/mobile\/add?platform=ios&#038;cntapi=signin&#038;cntapp=Simple%20Login&#038;cntpkg=com.couchbase.SimpleLogin<\/p>\n<p>En la p\u00e1gina anterior, haga clic en el bot\u00f3n <strong>Elegir y configurar servicios<\/strong> y acceder\u00e1 a una nueva p\u00e1gina en la que podr\u00e1 activar <strong>Inicio de sesi\u00f3n en Google<\/strong>. A continuaci\u00f3n, haga clic en <strong>Generar archivos de configuraci\u00f3n<\/strong> y descarga el nuevo archivo plist.<\/p>\n<p>Importar <strong>GoogleServer-Info.plist<\/strong> a su proyecto Xcode:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2015\/october\/adding-google-sign-in-with-node.js-to-a-couchbase-mobile-application\/xcode-import-plist.png\" \/><\/p>\n<h3>A\u00f1adir esquemas de URL a su proyecto<\/h3>\n<p>Google Sign-In requiere que se a\u00f1adan dos esquemas de URL personalizados a su proyecto. Para a\u00f1adir los esquemas personalizados:<\/p>\n<ol>\n<li>Abra la configuraci\u00f3n de su proyecto: haga doble clic en el nombre del proyecto en la vista en \u00e1rbol de la izquierda. Seleccione su aplicaci\u00f3n en el men\u00fa <strong>OBJETIVOS<\/strong> y, a continuaci\u00f3n, seleccione <strong>Informaci\u00f3n<\/strong> y ampl\u00ede la pesta\u00f1a <strong>Tipos de URL<\/strong> secci\u00f3n.<\/li>\n<li>Haga clic en el bot\u00f3n <strong>+<\/strong> y a\u00f1ada un esquema de URL para su ID de cliente invertido. Para encontrar este valor, abra la ventana <code>GoogleService-Info.plist<\/code> y busque el campo <code>REVERSED_CLIENT_ID<\/code> clave. Copie el valor de esa tecla y p\u00e9guelo en el campo <strong>Esquemas de URL<\/strong> en la p\u00e1gina de configuraci\u00f3n. Deje los dem\u00e1s campos en blanco.<\/li>\n<li>Haga clic en el bot\u00f3n <strong>+<\/strong> y a\u00f1ada un segundo esquema de URL. Este es el mismo que el ID del paquete de tu aplicaci\u00f3n. En este caso, deber\u00eda ser <strong>com.couchbase.SimpleLogin<\/strong>.<\/li>\n<\/ol>\n<p>Una vez completado, su configuraci\u00f3n debe ser algo similar a lo siguiente (pero con los valores espec\u00edficos de su aplicaci\u00f3n):<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2015\/october\/adding-google-sign-in-with-node.js-to-a-couchbase-mobile-application\/xcode-url-types.png\" \/><\/p>\n<h3>C\u00f3mo integrar el inicio de sesi\u00f3n de Google en tu aplicaci\u00f3n para iOS<\/h3>\n<p>Ahora que tu proyecto est\u00e1 configurado correctamente puedes empezar a usar el SDK para a\u00f1adir el bot\u00f3n de Login en la UI y la l\u00f3gica de la aplicaci\u00f3n para recuperar la informaci\u00f3n del usuario. En <strong>AppDelegate.swift<\/strong>declara que esta clase implementa el m\u00e9todo <code>GIDSignInDelegate<\/code> y a\u00f1ada lo siguiente en el campo <code>application:didFinishLaunchingConOpciones:<\/code> m\u00e9todo:<\/p>\n<pre><code class=\"language-swift\">func application(application: UIApplication,\r\n  didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -&gt; Bool {\r\n    \/\/ Initialize sign-in\r\n    var configureError: NSError?\r\n    GGLContext.sharedInstance().configureWithError(&amp;configureError)\r\n    assert(configureError == nil, \"Error configuring Google services: (configureError)\")\r\n\r\n    GIDSignIn.sharedInstance().delegate = self\r\n\r\n    return true\r\n}<\/code><\/pre>\n<p>A continuaci\u00f3n, aplique el <code>aplicaci\u00f3n:openURL:<\/code> del delegado de la aplicaci\u00f3n. El m\u00e9todo debe llamar al m\u00e9todo <code>handleURL<\/code> m\u00e9todo del <code>GIDSignIn<\/code> que gestionar\u00e1 correctamente la URL que reciba su aplicaci\u00f3n al final del proceso de autenticaci\u00f3n:<\/p>\n<pre><code class=\"language-swift\">func application(application: UIApplication,\r\n  openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -&gt; Bool {\r\n    return GIDSignIn.sharedInstance().handleURL(url,\r\n        sourceApplication: sourceApplication,\r\n        annotation: annotation)\r\n}<\/code><\/pre>\n<p>En el delegado de la aplicaci\u00f3n, implemente el m\u00e9todo <code>GIDSignInDelegate<\/code> para gestionar el proceso de inicio de sesi\u00f3n mediante la definici\u00f3n de los siguientes m\u00e9todos:<\/p>\n<pre><code class=\"language-swift\">func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!,\r\n  withError error: NSError!) {\r\n    if (error == nil) {\r\n      \/\/ Perform any operations on signed in user here.\r\n      let userId = user.userID                  \/\/ For client-side use only!\r\n      let idToken = user.authentication.idToken \/\/ Safe to send to the server\r\n      let name = user.profile.name\r\n      let email = user.profile.email\r\n      \/\/ ...\r\n    } else {\r\n      println(\"(error.localizedDescription)\")\r\n    }\r\n}<\/code><\/pre>\n<h3>A\u00f1adir el bot\u00f3n de inicio de sesi\u00f3n<\/h3>\n<p>A continuaci\u00f3n, a\u00f1adir\u00e1s el bot\u00f3n de inicio de sesi\u00f3n de Google para que el usuario pueda iniciar el proceso de inicio de sesi\u00f3n. En el controlador de vista que gestiona la pantalla de inicio de sesi\u00f3n de tu aplicaci\u00f3n, haz que la clase implemente el m\u00e9todo <code>GIDSignInUIDelegado<\/code> protocolo.<\/p>\n<p>En el controlador de vista, anule el m\u00e9todo viewDidLoad para establecer el delegado de interfaz de usuario del objeto GIDSignIn y (opcionalmente) para iniciar sesi\u00f3n de forma silenciosa cuando sea posible.<\/p>\n<pre><code class=\"language-swift\">override func viewDidLoad() {\r\n  super.viewDidLoad()\r\n\r\n  GIDSignIn.sharedInstance().uiDelegate = self\r\n\r\n  \/\/ Uncomment to automatically sign in the user.\r\n  \/\/GIDSignIn.sharedInstance().signInSilently()\r\n\r\n  \/\/ TODO(developer) Configure the sign-in button look\/feel\r\n  \/\/ ...\r\n}<\/code><\/pre>\n<p>Aplicar la <code>GIDSignInUIDelegado<\/code> protocolo:<\/p>\n<pre><code class=\"language-swift\">\/\/ Implement these methods only if the GIDSignInUIDelegate is not a subclass of\r\n\/\/ UIViewController.\r\n\r\n\/\/ Stop the UIActivityIndicatorView animation that was started when the user\r\n\/\/ pressed the Sign In button\r\nfunc signInWillDispatch(signIn: GIDSignIn!, error: NSError!) {\r\n  myActivityIndicator.stopAnimating()\r\n}\r\n\r\n\/\/ Present a view that prompts the user to sign in with Google\r\nfunc signIn(signIn: GIDSignIn!,\r\n    presentViewController viewController: UIViewController!) {\r\n  self.presentViewController(viewController, animated: true, completion: nil)\r\n}\r\n\r\n\/\/ Dismiss the \"Sign in with Google\" view\r\nfunc signIn(signIn: GIDSignIn!,\r\n    dismissViewController viewController: UIViewController!) {\r\n  self.dismissViewControllerAnimated(true, completion: nil)\r\n}<\/code><\/pre>\n<p>A\u00f1adir un <code>GIDSignInButton<\/code> a su gui\u00f3n gr\u00e1fico, archivo XIB, o instanciarlo mediante programaci\u00f3n. Para a\u00f1adir el bot\u00f3n al gui\u00f3n gr\u00e1fico o al archivo XIB, a\u00f1ada una vista y defina su clase personalizada como <code>GIDSignInButton<\/code>.<\/p>\n<p>Ejecuta la aplicaci\u00f3n y ahora deber\u00edas ver el bot\u00f3n con el estilo de Google y poder iniciar sesi\u00f3n:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2015\/october\/adding-google-sign-in-with-node.js-to-a-couchbase-mobile-application\/run-signin-button.png\" \/><\/p>\n<h3>Creaci\u00f3n de una sesi\u00f3n con Sync Gateway<\/h3>\n<p>En <strong>AppDelegate.swift<\/strong>encuentre el <code>signIndidSignInForUserwithError<\/code> y a\u00f1ada lo siguiente debajo del c\u00f3digo existente:<\/p>\n<pre><code class=\"language-swift\">\/\/ 1\r\nlet loginURL = NSURL(string: \"https:\/\/localhost:8000\/google_signin\")!\r\n\r\n\/\/ 2\r\nlet session = NSURLSession.sharedSession()\r\nlet request = NSMutableURLRequest(URL: loginURL)\r\nrequest.addValue(\"application\/json\", forHTTPHeaderField: \"Content-Type\")\r\nrequest.HTTPMethod = \"POST\"\r\n\r\n\/\/ 3\r\nvar properties = [\r\n    \"user_id\": userId,\r\n    \"auth_provider\": \"google\"\r\n]\r\nlet data = try! NSJSONSerialization.dataWithJSONObject(properties, options: NSJSONWritingOptions.PrettyPrinted)\r\n\r\n\/\/ 4\r\nlet uploadTask = session.uploadTaskWithRequest(request, fromData: data, completionHandler: { (data, response, error) -&gt; Void in\r\n    \/\/ 5\r\n    let json = try! NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.AllowFragments) as! Dictionary&lt;String, AnyObject&gt;\r\n    print(\"(json)\")\r\n    \r\n    \/\/ TODO: pull\/push replications with authenticated user\r\n    \r\n})\r\nuploadTask.resume()<\/code><\/pre>\n<p>Esto es lo que ocurre arriba:<\/p>\n<ol>\n<li>La URL de inicio de sesi\u00f3n en el App Server que se ejecuta localmente.<\/li>\n<li>Crear una instancia de solicitud.<\/li>\n<li>Serializa las propiedades que contienen el ID de usuario de Google como JSON para enviarlas en la solicitud.<\/li>\n<li>Enviar solicitud POST.<\/li>\n<li>Objeto de respuesta que contiene las credenciales de la sesi\u00f3n de Sync Gateway<\/li>\n<\/ol>\n<p><strong>NOTA:<\/strong> Antes de ejecutar la aplicaci\u00f3n, aseg\u00farese de desactivar la seguridad de App Transport, ya que App Server no utiliza HTTPS. Abra <strong>Info.plist<\/strong> y a\u00f1ade lo siguiente:<\/p>\n<pre><code class=\"language-xml\">NSAppTransportSecurity\r\n\r\nNSAllowsArbitraryLoads\r\n<\/code><\/pre>\n<p>Construir y ejecutar. Observa la respuesta del App Server en el depurador de Xcode:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2015\/october\/adding-google-sign-in-with-node.js-to-a-couchbase-mobile-application\/run-logs.png\" \/><\/p>\n<p>Por \u00faltimo, a\u00f1adir\u00e1s el c\u00f3digo de Couchbase para iniciar una replicaci\u00f3n pull con los detalles de la sesi\u00f3n. En <strong>AppDelegate.m<\/strong>a\u00f1ada el m\u00e9todo <code>startReplications<\/code>:<\/p>\n<pre><code class=\"language-swift\">func startReplications(sessionInfo: Dictionary&lt;String, String&gt;) {\r\n    \/\/ 1\r\n    let dateString = sessionInfo[\"expires\"]!\r\n    let dateFormatter = NSDateFormatter()\r\n    dateFormatter.dateFormat = \"yyyy-MM-dd'T'HH:mm:ss.SSSZ\"\r\n    let date = dateFormatter.dateFromString(dateString)!\r\n    \r\n    \/\/ 2\r\n    let manager = CBLManager.sharedInstance();\r\n    let database = try! manager.databaseNamed(\"simple-login\")\r\n    \r\n    \/\/ 3\r\n    let syncGatewayURL = NSURL(string: \"https:\/\/localhost:8000\/simple-login\")!\r\n    let pull = database.createPullReplication(syncGatewayURL)\r\n    pull?.continuous = true\r\n    \r\n    \/\/ 4\r\n    pull?.setCookieNamed(sessionInfo[\"cookie_name\"]!, withValue: sessionInfo[\"session_id\"]!, path: \"\/\", expirationDate: date, secure: false)\r\n    pull?.start()\r\n}<\/code><\/pre>\n<p>Llama a este m\u00e9todo en el callback de la uploadTask que has a\u00f1adido en el paso anterior.<\/p>\n<p>\u00a1Et voil\u00e0! Ahora tiene una replicaci\u00f3n pull en ejecuci\u00f3n para el usuario con nombre <code>google-{userID}<\/code>. Puedes probar que el acceso funciona a\u00f1adiendo un documento con el siguiente comando (sustituye el ID de usuario de Google por el de un usuario ya conectado):<\/p>\n<pre><code class=\"language-bash\">$ curl -vX POST \r\n        -H 'Content-Type: application\/json' \r\n        https:\/\/localhost:4985\/simple-login\/ \r\n        -d '{\"_id\": \"1234\", \"user_id\": \"google-102898171485172449137\"}'<\/code><\/pre>\n<p>Vaya a la pesta\u00f1a Usuarios de la interfaz de administraci\u00f3n en <a href=\"https:\/\/localhost:4985\/_admin\/db\/simple-login\/users\">https:\/\/localhost:4985\/_admin\/db\/simple-login\/users<\/a> y observe que el usuario <code>google-102898171485172449137<\/code> ahora tiene acceso al canal <code>1234<\/code>:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2015\/october\/adding-google-sign-in-with-node.js-to-a-couchbase-mobile-application\/final-test.png\" \/><\/p>\n<h2>\u00bfQu\u00e9 hacer a partir de ahora?<\/h2>\n<p>\u00a1Enhorabuena! Has aprendido a utilizar Google SignIn con Couchbase Mobile para crear una experiencia agradable y sincronizar documentos por el ID de usuario del usuario conectado.<\/p>\n<p>No dudes en compartir tus opiniones, hallazgos o preguntas en los comentarios o en los foros. \u00a1Hasta pronto!<\/p>","protected":false},"excerpt":{"rendered":"<p>Using OAuth APIs provided by 3rd party applications such as Google+ to login in your mobile app can provide a delightful first time experience to users. They can login with an account that they already know and trust and populate [&hellip;]<\/p>","protected":false},"author":51,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1810],"tags":[],"ppma_author":[9028],"class_list":["post-1987","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-mobile"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Google SignIn with Node.js to a Couchbase Mobile Application<\/title>\n<meta name=\"description\" content=\"Learn how to use Google SignIn with Couchbase Mobile to create a delightful experience and synchronize documents per the user ID of the logged in user.\" \/>\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\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Adding Google Sign-In with Node.js to a Couchbase Mobile application\" \/>\n<meta property=\"og:description\" content=\"Learn how to use Google SignIn with Couchbase Mobile to create a delightful experience and synchronize documents per the user ID of the logged in user.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-12-16T01:06:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-01-02T14:19:31+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=\"James Nocentini, Technical Writer, Mobile, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"James Nocentini, Technical Writer, Mobile, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/\"},\"author\":{\"name\":\"James Nocentini, Technical Writer, Mobile, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ec4dfbd349cb4a321fb6a92b71a9a7f6\"},\"headline\":\"Adding Google Sign-In with Node.js to a Couchbase Mobile application\",\"datePublished\":\"2015-12-16T01:06:39+00:00\",\"dateModified\":\"2019-01-02T14:19:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/\"},\"wordCount\":1424,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Couchbase Mobile\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/\",\"name\":\"Google SignIn with Node.js to a Couchbase Mobile Application\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-12-16T01:06:39+00:00\",\"dateModified\":\"2019-01-02T14:19:31+00:00\",\"description\":\"Learn how to use Google SignIn with Couchbase Mobile to create a delightful experience and synchronize documents per the user ID of the logged in user.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#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\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Adding Google Sign-In with Node.js to a Couchbase Mobile application\"}]},{\"@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\/ec4dfbd349cb4a321fb6a92b71a9a7f6\",\"name\":\"James Nocentini, Technical Writer, Mobile, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/09977bdd14473dc23a125f2f74c3e816\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g\",\"caption\":\"James Nocentini, Technical Writer, Mobile, Couchbase\"},\"description\":\"James Nocentini is the Technical Writer in charge of the documentation for Couchbase Mobile. Previously, he worked as a Developer Advocate and before that as a front-end developer for HouseTrip. He also enjoys writing Android tutorials for raywenderlich.com in his spare time.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/james-nocentini\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Google SignIn with Node.js to a Couchbase Mobile Application","description":"Learn how to use Google SignIn with Couchbase Mobile to create a delightful experience and synchronize documents per the user ID of the logged in user.","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\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/","og_locale":"es_MX","og_type":"article","og_title":"Adding Google Sign-In with Node.js to a Couchbase Mobile application","og_description":"Learn how to use Google SignIn with Couchbase Mobile to create a delightful experience and synchronize documents per the user ID of the logged in user.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-12-16T01:06:39+00:00","article_modified_time":"2019-01-02T14:19:31+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":"James Nocentini, Technical Writer, Mobile, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"James Nocentini, Technical Writer, Mobile, Couchbase","Est. reading time":"11 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/"},"author":{"name":"James Nocentini, Technical Writer, Mobile, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ec4dfbd349cb4a321fb6a92b71a9a7f6"},"headline":"Adding Google Sign-In with Node.js to a Couchbase Mobile application","datePublished":"2015-12-16T01:06:39+00:00","dateModified":"2019-01-02T14:19:31+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/"},"wordCount":1424,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Couchbase Mobile"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/","url":"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/","name":"Google SignIn with Node.js to a Couchbase Mobile Application","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-12-16T01:06:39+00:00","dateModified":"2019-01-02T14:19:31+00:00","description":"Learn how to use Google SignIn with Couchbase Mobile to create a delightful experience and synchronize documents per the user ID of the logged in user.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#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\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Adding Google Sign-In with Node.js to a Couchbase Mobile application"}]},{"@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\/ec4dfbd349cb4a321fb6a92b71a9a7f6","name":"James Nocentini, Redactor t\u00e9cnico, M\u00f3vil, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/09977bdd14473dc23a125f2f74c3e816","url":"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g","caption":"James Nocentini, Technical Writer, Mobile, Couchbase"},"description":"James Nocentini es el escritor t\u00e9cnico encargado de la documentaci\u00f3n de Couchbase Mobile. Anteriormente, trabaj\u00f3 como Developer Advocate y antes de eso como desarrollador front-end para HouseTrip. Tambi\u00e9n disfruta escribiendo tutoriales de Android para raywenderlich.com en su tiempo libre.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/james-nocentini\/"}]}},"authors":[{"term_id":9028,"user_id":51,"is_guest":0,"slug":"james-nocentini","display_name":"James Nocentini, Technical Writer, Mobile, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/0aa80108e5c81e282d705199edae5a25f8ef92abf15cd64f8ff19837abcee09a?s=96&d=mm&r=g","author_category":"","last_name":"Nocentini","first_name":"James","job_title":"","user_url":"","description":"James Nocentini es el escritor t\u00e9cnico encargado de la documentaci\u00f3n de Couchbase Mobile. Anteriormente, trabaj\u00f3 como Developer Advocate y antes de eso como desarrollador front-end para HouseTrip. Tambi\u00e9n disfruta escribiendo tutoriales de Android para raywenderlich.com en su tiempo libre."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1987","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\/51"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=1987"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1987\/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=1987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=1987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=1987"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=1987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}