{"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\/pt\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/","title":{"rendered":"Adi\u00e7\u00e3o do Google Sign-In com Node.js a um aplicativo Couchbase Mobile"},"content":{"rendered":"<p>O uso de APIs OAuth fornecidas por aplicativos de terceiros, como o Google+, para fazer login no seu aplicativo m\u00f3vel pode proporcionar uma experi\u00eancia agrad\u00e1vel aos usu\u00e1rios na primeira vez. Eles podem fazer login com uma conta que j\u00e1 conhecem e confiam e preencher o perfil com os dados que inseriram no Google+. Neste tutorial, voc\u00ea aprender\u00e1 a:<\/p>\n<ul>\n<li>Escreva um aplicativo Node.js para lidar com a autentica\u00e7\u00e3o com o Sync Gateway.<\/li>\n<li>Use a API REST do administrador do Couchbase Sync Gateway para criar usu\u00e1rios e sess\u00f5es.<\/li>\n<li>Integre o Google Sign-In a um aplicativo iOS escrito com Swift 2.<\/li>\n<li>Crie um aplicativo iOS simples em Swift para testar o novo endpoint de login e replicar alguns documentos.<\/li>\n<\/ul>\n<p>O projeto final pode ser encontrado em <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>\u00a0Pr\u00e9-requisitos<\/h2>\n<p>Os pr\u00e9-requisitos para este tutorial s\u00e3o:<\/p>\n<ul>\n<li>Node.js<\/li>\n<li>Xcode 7+ (voc\u00ea usar\u00e1 o Swift 2 para criar o aplicativo de amostra)<\/li>\n<\/ul>\n<h2>Primeiros passos<\/h2>\n<p>Fa\u00e7a o download do Sync Gateway no link abaixo e descompacte o arquivo:<\/p>\n<p>https:\/\/www.couchbase.com\/nosql-databases\/downloads<\/p>\n<p>Em um novo arquivo chamado <strong>sync-gateway-config.json<\/strong>, cole o seguinte:<\/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>Nesse arquivo de configura\u00e7\u00e3o, voc\u00ea est\u00e1 criando um banco de dados chamado <strong>login simples<\/strong> e usando a fun\u00e7\u00e3o Sync para mapear cada documento para um canal diferente e conceder a um usu\u00e1rio acesso ao canal (o nome do usu\u00e1rio \u00e9 armazenado no <code>user_id<\/code> do documento).<\/p>\n<p>Inicie o Sync Gateway com o seguinte comando:<\/p>\n<pre><code class=\"language-bash\">$ ~\/Downloads\/couchbase-sync-gateway\/bin\/sync_gateway sync-gateway-config.json<\/code><\/pre>\n<h2>Proxy reverso para gateway de sincroniza\u00e7\u00e3o<\/h2>\n<p>Com o Sync Gateway em execu\u00e7\u00e3o, voc\u00ea pode mudar seu foco para a cria\u00e7\u00e3o do App Server para lidar com a autentica\u00e7\u00e3o entre o Google e o Sync Gateway.<\/p>\n<p>Voc\u00ea usar\u00e1 o popular <a href=\"https:\/\/expressjs.com\/\">Expresso<\/a> para tratar a solicita\u00e7\u00e3o de cria\u00e7\u00e3o de um usu\u00e1rio e o m\u00f3dulo <a href=\"https:\/\/github.com\/request\/request\">solicita\u00e7\u00e3o<\/a> para fazer proxy de todos os outros tr\u00e1fegos para o Sync Gateway.<\/p>\n<p>Instale os seguintes m\u00f3dulos do Node.js:<\/p>\n<pre><code class=\"language-bash\">$ npm install express body-parser request --save<\/code><\/pre>\n<p>Crie um novo arquivo chamado <strong>servidor.js<\/strong> e adicione o seguinte:<\/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>Aqui est\u00e3o as diferentes coisas que est\u00e3o acontecendo:<\/p>\n<ol>\n<li>Requer o m\u00f3dulo Node.js que voc\u00ea instalou anteriormente.<\/li>\n<li>Instanciar uma nova inst\u00e2ncia do express e usar o <strong>bodyParser<\/strong> middleware apenas para o <strong>\/google_signin<\/strong> ponto final.<\/li>\n<li>Proxy de todas as outras solicita\u00e7\u00f5es para o Sync Gateway.<\/li>\n<li>Inicie o servidor da Web Node.js na porta 8000.<\/li>\n<\/ol>\n<p>Inicie o servidor com <code>$ node server.js<\/code> e aberto <code>https:\/\/localhost:8000<\/code> em seu navegador. Voc\u00ea ver\u00e1 a mensagem de boas-vindas do 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>Do Google SignIn para sincronizar sess\u00f5es do Gateway<\/h3>\n<p>Com o proxy reverso instalado, agora voc\u00ea pode adicionar algum c\u00f3digo para tratar a solicita\u00e7\u00e3o do Google SignIn e retornar as credenciais da sess\u00e3o:<\/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>Algumas coisas est\u00e3o acontecendo nesse diagrama:<\/p>\n<ul>\n<li><strong>Preto<\/strong> envia o ID de usu\u00e1rio do Google para o App Server.<\/li>\n<li><strong>Azul<\/strong> verifica se existe um usu\u00e1rio no Sync Gateway com esse ID de usu\u00e1rio.<\/li>\n<li><strong>Laranja<\/strong> cria o usu\u00e1rio se ele ainda n\u00e3o existir (normalmente, na primeira vez em que o usu\u00e1rio faz login com o Google no seu aplicativo).<\/li>\n<li><strong>Verde<\/strong> cria uma sess\u00e3o, a resposta conter\u00e1 credenciais de sess\u00e3o que podem ser passadas para o aplicativo cliente iOS para replica\u00e7\u00f5es push\/pull. Todos os SDKs do Couchbase Lite t\u00eam um m\u00e9todo para especificar as credenciais de sess\u00e3o a serem usadas nas replica\u00e7\u00f5es push\/pull.<\/li>\n<\/ul>\n<p>No <strong>\/google_signin<\/strong> adicione o seguinte:<\/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>Reinicie o aplicativo Node.js e execute a seguinte solicita\u00e7\u00e3o curl para registrar um novo usu\u00e1rio:<\/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>Na pr\u00f3xima se\u00e7\u00e3o, voc\u00ea criar\u00e1 um aplicativo iOS simples com o Swift 2 para usar a nova funcionalidade do seu App Server.<\/p>\n<h2>Swift Time: tela de login simples para iOS<\/h2>\n<p>V\u00e1 para o Xcode e crie um novo projeto com a tag <strong>Aplicativo de visualiza\u00e7\u00e3o \u00fanica<\/strong> modelo:<\/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 o Cocoapods para instalar depend\u00eancias neste projeto. Feche o projeto Xcode e, na linha de comando, execute <code>Inicializa\u00e7\u00e3o do pod $<\/code> para migrar seu projeto para o uso de Cocoapods. Abra o arquivo <strong>Podfile<\/strong> e adicione as declara\u00e7\u00f5es:<\/p>\n<pre><code class=\"language-none\">pod 'Google\/SignIn'\r\npod 'couchbase-lite-ios'<\/code><\/pre>\n<p>Executar <code>Instala\u00e7\u00e3o do pod $<\/code> e abra o <strong>SimpleLogin.xcworkspace<\/strong> que foi gerado. Em seguida, voc\u00ea adicionar\u00e1 um cabe\u00e7alho de ponte para acessar os SDKs do Google SignIn e do CouchbaseLite que usam Objective-C a partir do seu c\u00f3digo Swift. No navegador de projetos do Xcode, clique com o bot\u00e3o direito do mouse em SimpleLogin e selecione <strong>Novo arquivo...<\/strong>. Escolha o modelo Header File e chame-o de <strong>bridging-header.h<\/strong>. Adicione as seguintes instru\u00e7\u00f5es de importa\u00e7\u00e3o:<\/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>Agora voc\u00ea precisa informar ao Xcode para usar esse arquivo. No arquivo <strong>SimpleLogin<\/strong> alvo, selecione o <strong>Configura\u00e7\u00f5es de constru\u00e7\u00e3o<\/strong> e role para baixo at\u00e9 a guia <strong>Cabe\u00e7alho de ponte em Objective-C<\/strong>. Adicione este caminho de arquivo:<\/p>\n<p>SimpleLogin\/bridging-header.h<\/p>\n<h3>Arquivo de configura\u00e7\u00e3o de login do Google<\/h3>\n<p>Antes de poder usar o SDK de login em seu aplicativo, voc\u00ea precisar\u00e1 criar um novo projeto no Google Developer Console e gerar um ID de cliente. Felizmente para n\u00f3s, isso pode ser feito automaticamente com o seguinte link:<\/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>Na p\u00e1gina acima, clique no bot\u00e3o <strong>Escolha e configure servi\u00e7os<\/strong> e voc\u00ea ser\u00e1 levado a uma nova p\u00e1gina na qual poder\u00e1 ativar o <strong>Login do Google<\/strong>. A partir da\u00ed, clique em <strong>Gerar arquivos de configura\u00e7\u00e3o<\/strong> e fa\u00e7a o download do novo arquivo plist.<\/p>\n<p>Importa\u00e7\u00e3o <strong>GoogleServer-Info.plist<\/strong> em seu projeto 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>Adi\u00e7\u00e3o de esquemas de URL ao seu projeto<\/h3>\n<p>O Google Sign-In exige que dois esquemas de URL personalizados sejam adicionados ao seu projeto. Para adicionar os esquemas personalizados:<\/p>\n<ol>\n<li>Abra a configura\u00e7\u00e3o do projeto: clique duas vezes no nome do projeto na visualiza\u00e7\u00e3o em \u00e1rvore \u00e0 esquerda. Selecione seu aplicativo na se\u00e7\u00e3o <strong>METAS<\/strong> e, em seguida, selecione a se\u00e7\u00e3o <strong>Informa\u00e7\u00f5es<\/strong> e expanda a guia <strong>Tipos de URL<\/strong> se\u00e7\u00e3o.<\/li>\n<li>Clique no bot\u00e3o <strong>+<\/strong> e adicione um esquema de URL para seu ID de cliente invertido. Para encontrar esse valor, abra o arquivo <code>GoogleService-Info.plist<\/code> e procure o arquivo de configura\u00e7\u00e3o <code>REVERSED_CLIENT_ID<\/code> chave. Copie o valor dessa chave e cole-o no campo <strong>Esquemas de URL<\/strong> na p\u00e1gina de configura\u00e7\u00e3o. Deixe os outros campos em branco.<\/li>\n<li>Clique no bot\u00e3o <strong>+<\/strong> e adicione um segundo esquema de URL. Esse esquema \u00e9 o mesmo que o ID do pacote do seu aplicativo. Nesse caso, ele deve ser <strong>com.couchbase.SimpleLogin<\/strong>.<\/li>\n<\/ol>\n<p>Quando conclu\u00edda, sua configura\u00e7\u00e3o deve ser semelhante \u00e0 seguinte (mas com os valores espec\u00edficos do aplicativo):<\/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>Integra\u00e7\u00e3o do Google Sign-In em seu aplicativo iOS<\/h3>\n<p>Agora que seu projeto est\u00e1 configurado corretamente, voc\u00ea pode come\u00e7ar a usar o SDK para adicionar o bot\u00e3o Login na interface do usu\u00e1rio e a l\u00f3gica do aplicativo para recuperar as informa\u00e7\u00f5es do usu\u00e1rio. Em <strong>AppDelegate.swift<\/strong>declare que essa classe implementa a classe <code>GIDSignInDelegate<\/code> e adicione o seguinte no campo <code>aplicativo:didFinishLaunchingWithOptions:<\/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>Em seguida, implemente o <code>aplicativo:openURL:<\/code> do seu aplicativo delegado. O m\u00e9todo deve chamar o <code>handleURL<\/code> do m\u00e9todo <code>GIDSignIn<\/code> que tratar\u00e1 corretamente o URL que seu aplicativo recebe no final do processo de autentica\u00e7\u00e3o:<\/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>No delegado do aplicativo, implemente o <code>GIDSignInDelegate<\/code> para lidar com o processo de login, definindo os seguintes 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>Adi\u00e7\u00e3o do bot\u00e3o de login<\/h3>\n<p>Em seguida, voc\u00ea adicionar\u00e1 o bot\u00e3o Google Sign-In para que o usu\u00e1rio possa iniciar o processo de login. No view controller que gerencia a tela de login do seu aplicativo, fa\u00e7a com que a classe implemente a classe <code>GIDSignInUIDelegado<\/code> protocolo.<\/p>\n<p>No view controller, substitua o m\u00e9todo viewDidLoad para definir o delegado da interface do usu\u00e1rio do objeto GIDSignIn e (opcionalmente) para fazer login silenciosamente quando poss\u00edvel.<\/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>Implementar o <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>Adicionar um <code>GIDSignInButton<\/code> ao seu storyboard ou arquivo XIB, ou instanci\u00e1-lo programaticamente. Para adicionar o bot\u00e3o ao seu storyboard ou arquivo XIB, adicione uma visualiza\u00e7\u00e3o e defina sua classe personalizada como <code>GIDSignInButton<\/code>.<\/p>\n<p>Execute o aplicativo e voc\u00ea ver\u00e1 o bot\u00e3o com o estilo do Google e poder\u00e1 fazer login:<\/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>Cria\u00e7\u00e3o de uma sess\u00e3o com o Sync Gateway<\/h3>\n<p>Em <strong>AppDelegate.swift<\/strong>, encontre o <code>signIndidSignInForUserwithError<\/code> e adicione o seguinte abaixo do 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>Veja o que est\u00e1 acontecendo acima:<\/p>\n<ol>\n<li>O URL de login no App Server em execu\u00e7\u00e3o local.<\/li>\n<li>Criar uma inst\u00e2ncia de solicita\u00e7\u00e3o.<\/li>\n<li>Serialize as propriedades que cont\u00eam o ID de usu\u00e1rio do Google como JSON a ser enviado na solicita\u00e7\u00e3o.<\/li>\n<li>Enviar solicita\u00e7\u00e3o POST.<\/li>\n<li>Objeto de resposta que cont\u00e9m as credenciais da sess\u00e3o do Sync Gateway<\/li>\n<\/ol>\n<p><strong>OBSERVA\u00c7\u00c3O:<\/strong> Antes de executar o aplicativo, certifique-se de desativar a seguran\u00e7a do App Transport, pois o App Server n\u00e3o est\u00e1 usando HTTPS. Abra o aplicativo <strong>Info.plist<\/strong> e adicione o seguinte:<\/p>\n<pre><code class=\"language-xml\">NSAppTransportSecurity\r\n\r\nNSAllowsArbitraryLoads\r\n<\/code><\/pre>\n<p>Compilar e executar. Observe a resposta do App Server no depurador do 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 fim, voc\u00ea adicionar\u00e1 o c\u00f3digo do Couchbase para iniciar uma replica\u00e7\u00e3o pull com os detalhes da sess\u00e3o. Em <strong>AppDelegate.m<\/strong>, adicione o 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>Chame esse m\u00e9todo na chamada de retorno do uploadTask que voc\u00ea adicionou na etapa anterior.<\/p>\n<p>E pronto! Agora voc\u00ea tem uma replica\u00e7\u00e3o pull em execu\u00e7\u00e3o para o usu\u00e1rio com o nome <code>google-{userID}<\/code>. Voc\u00ea pode testar se o acesso est\u00e1 funcionando adicionando um documento com o seguinte comando (substitua o ID de usu\u00e1rio do Google pelo de um usu\u00e1rio j\u00e1 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>V\u00e1 at\u00e9 a guia Usu\u00e1rios na interface do usu\u00e1rio do administrador em <a href=\"https:\/\/localhost:4985\/_admin\/db\/simple-login\/users\">https:\/\/localhost:4985\/_admin\/db\/simple-login\/users<\/a> e observe que o usu\u00e1rio <code>google-102898171485172449137<\/code> agora tem acesso ao 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>Para onde ir a partir de agora<\/h2>\n<p>Parab\u00e9ns! Voc\u00ea aprendeu a usar o Google SignIn com o Couchbase Mobile para criar uma experi\u00eancia agrad\u00e1vel e sincronizar documentos de acordo com o ID do usu\u00e1rio conectado.<\/p>\n<p>Sinta-se \u00e0 vontade para compartilhar seus coment\u00e1rios, descobertas ou fazer perguntas nos coment\u00e1rios abaixo ou nos f\u00f3runs. Falamos com voc\u00ea em breve!<\/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.1 (Yoast SEO v26.1.1) - 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\/pt\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"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\/ec4dfbd349cb4a321fb6a92b71a9a7f6\",\"name\":\"James Nocentini, Technical Writer, Mobile, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\/pt\/author\/james-nocentini\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Google SignIn with Node.js to a Couchbase Mobile Application","description":"Saiba como usar o Google SignIn com o Couchbase Mobile para criar uma experi\u00eancia agrad\u00e1vel e sincronizar documentos de acordo com o ID do usu\u00e1rio conectado.","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\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/","og_locale":"pt_BR","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\/pt\/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":"pt-BR","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":"Saiba como usar o Google SignIn com o Couchbase Mobile para criar uma experi\u00eancia agrad\u00e1vel e sincronizar documentos de acordo com o ID do usu\u00e1rio conectado.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/adding-google-sign-in-with-node-js-to-a-couchbase-mobile-application\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"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\/ec4dfbd349cb4a321fb6a92b71a9a7f6","name":"James Nocentini, redator t\u00e9cnico, celular, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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 \u00e9 o redator t\u00e9cnico respons\u00e1vel pela documenta\u00e7\u00e3o do Couchbase Mobile. Anteriormente, ele trabalhou como Developer Advocate e, antes disso, como desenvolvedor front-end da HouseTrip. Ele tamb\u00e9m gosta de escrever tutoriais sobre Android para raywenderlich.com em seu tempo livre.","url":"https:\/\/www.couchbase.com\/blog\/pt\/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 \u00e9 o redator t\u00e9cnico respons\u00e1vel pela documenta\u00e7\u00e3o do Couchbase Mobile. Anteriormente, ele trabalhou como Developer Advocate e, antes disso, como desenvolvedor front-end da HouseTrip. Ele tamb\u00e9m gosta de escrever tutoriais sobre Android para raywenderlich.com em seu tempo livre."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1987","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\/51"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1987"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1987\/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=1987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1987"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}