Con la API de Sync Gateway, puede autenticarse en el lado del cliente como un usuario específico para replicar los datos a los que este usuario tiene acceso. En el caso de la autenticación básica, el usuario ya debe existir en la base de datos de Sync Gateway. Hay dos formas de crear usuarios:
- En el archivo de configuración
usuarioscampo. - En la API REST de Admin.
Para proporcionar una pantalla de inicio de sesión y registro, debe configurar un servidor de aplicaciones que gestione la creación de usuarios en consecuencia, ya que el puerto de administración (4985) no es de acceso público. En este tutorial, aprenderás cómo:
- Utilice la API REST de Admin para crear un usuario.
- Configurar un App Server con Node.js para gestionar los usuarios.
- Diseñe una pantalla de inicio de sesión y registro en una aplicación Android de ejemplo para probar su App Server.
Para empezar
Descargue Sync Gateway y descomprima el archivo:
https://www.couchbase.com/nosql-databases/downloads#Couchbase_Mobile
Para este tutorial, no necesitarás un archivo de configuración. Para las propiedades básicas de configuración, puede utilizar las opciones de la línea de comandos. El binario a ejecutar se encuentra en ~/Downloads/couchbase-sync-gateway/bin/. Ejecute el programa con la tecla --ayuda para ver la lista de opciones disponibles:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
~/Downloads/couchbase-sync-gateway/bin/sync_gateway --help Usage of /Users/jamesnocentini/Downloads/couchbase-sync-gateway/bin/sync_gateway: -adminInterface="127.0.0.1:4985": Address to bind admin interface to -bucket="sync_gateway": Name of bucket -configServer="": URL of server that can return database configs -dbname="": Name of Couchbase Server database (defaults to name of bucket) -deploymentID="": Customer/project identifier for stats reporting -interface=":4984": Address to bind to -log="": Log keywords, comma separated -logFilePath="": Path to log file -personaOrigin="": Base URL that clients use to connect to the server -pool="default": Name of pool -pretty=false: Pretty-print JSON responses -profileInterface="": Address to bind profile interface to -url="walrus:": Address of Couchbase server -verbose=false: Log more info about requests |
Para este tutorial, se especificará el dbname, interfaz, bonito y url:
|
1 |
~/Downloads/couchbase-sync-gateway/bin/sync_gateway -dbname="smarthome" -interface="0.0.0.0:4984" -pretty="true" -url="walrus:" |
Para crear un usuario, puede ejecutar lo siguiente en su terminal:
|
1 2 3 |
$ curl -vX POST -H 'Content-Type: application/json' -d '{"name": "adam", "password": "letmein"}' :4985/smarthome/_user/ |
NOTA: El campo nombre del objeto JSON no debe contener espacios.
Esto debería devolver un 201 Creado código de estado. Ahora, inicia sesión como este usuario en el puerto estándar:
|
1 2 3 |
$ curl -vX POST -H 'Content-Type: application/json' -d '{"name": "adam", "password": "letmein"}' :4984/smarthome/_session |
La respuesta contendrá un Set-Cookie y los datos del usuario en el cuerpo.
Todos los SDKs de Couchbase Mobile tienen un método para especificar el nombre de usuario y la contraseña para la autenticación, por lo que lo más probable es que no tengas que preocuparte de hacer esa segunda solicitud para iniciar sesión.
Servidor de aplicaciones
En esta sección, utilizará la función /_usuario Admin REST API endpoint público para permitir a los usuarios registrarse a través de la aplicación.
Utilizará el popular Express para gestionar la solicitud de creación de un usuario y el módulo solicitar para dirigir el resto del tráfico a Sync Gateway.

Instala los siguientes módulos de Node.js:
|
1 |
npm install express body-parser request http-proxy --save |
Abrir un nuevo archivo servidor.js y añade lo siguiente:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
var express = require('express') , bodyParser = require('body-parser') , request = require('request').defaults({json: true}) , httpProxy = require('http-proxy'); // 1 var app = express(); app.use('/signup', bodyParser.json()); // 2 app.post('/signup', function (req, res) { console.log('its signup time'); var json = req.body; var options = { url: 'https://0.0.0.0:4985/smarthome/_user/', method: 'POST', body: json }; request(options, function(error, response) { res.writeHead(response.statusCode); res.end(); }); }); // 3 app.all('*', function(req, res) { var url = 'https://0.0.0.0:4984' + req.url; req.pipe(request(url)).pipe(res); }); // 4 var server = app.listen(8000, function () { var host = server.address().address; var port = server.address().port; console.log('App listening at https://%s:%s', host, port); }); |
Esto es lo que ocurre paso a paso:
- Instanciar una nueva instancia de express y utilizar la función
bodyParsersólo si la ruta coincide coninscríbase en. De hecho, para todas las demás solicitudes enviadas a Sync Gateway se necesita el cuerpo de la solicitud sin procesar. - Manejar el
/inscripcióny utilizar el módulo de solicitud para crear el usuario en el puerto de administración. - Proxy todas las demás solicitudes a Sync Gateway.
- Inicia el servidor web Node.js en el puerto 8000.
A partir de ahora, utilizarás la siguiente url para crear usuarios a través de la aplicación y poner en marcha las réplicas push/pull:
https://localhost:8000
Cree otro usuario para comprobar que todo funciona como se espera:
|
1 2 3 |
$ curl -vX POST -H 'Content-Type: application/json' -d '{"name": "andy", "password": "letmein"}' :8000/signup/ |
Y para iniciar sesión como este usuario:
|
1 2 3 |
$ curl -vX POST -H 'Content-Type: application/json' -d '{"name": "andy", "password": "letmein"}' :8000/smarthome/_session |
En la siguiente sección, crearás una aplicación Android sencilla con una pantalla de inicio de sesión y registro para probar esos puntos finales.
Aplicación Android
Abra Android Studio y seleccione Iniciar un nuevo proyecto de Android Studio del Inicio rápido menú.
Nombre de la aplicación SmartHomeestablezca un dominio de empresa y una ubicación de proyecto adecuados y, a continuación, haga clic en Siguiente:

En el cuadro de diálogo Dispositivos Android de destino, asegúrese de marcar Teléfono y tabletaajuste el SDK mínimo a API 22: Android 5.1 (Lollipop) para ambos, y haga clic en Siguiente:

En la siguiente Añadir una actividad a Móvil seleccione Añadir Actividad en blanco y nombre la actividad Actividad de bienvenida:

Para construir las funcionalidades de registro e inicio de sesión se utilizarán dos dependencias:
- Biblioteca de apoyo al diseño de Androidpara tener componentes de texto de entrada que sigan las especificaciones de Material Design.
- OkHttppara gestionar las peticiones POST a
/inscripcióny/smarthome/sesión.
En build.gradleañade esas dependencias:
|
1 2 |
compile 'com.android.support:design:22.2.1' compile 'com.squareup.okhttp:okhttp:2.3.0' |
En actividad_bienvenida.xmlañada lo siguiente LinearLayout en el interior del RelativeLayout:
|
1 2 3 4 |
<button style="?android: attr/borderlessButtonStyle;"> </button><button style="?android: attr/borderlessButtonStyle;"> </button> |
Observe que ambos botones tienen un onClick atributo. Mueva el cursor del ratón sobre uno de los métodos y utilice la tecla alt + enter > Crear openLoginActivity(vista) para crear ese método en BienvenidoActividad:

Haga lo mismo con el Inscribirse botón.
A continuación, cree dos nuevas clases y diseños XML utilizando la función Actividad en blanco plantilla. Una debería llamarse Inicio de sesión y el otro Regístrese en:

En el openLoginActivity y openSignUpActivity añada las siguientes intenciones explícitas:
|
1 2 3 4 5 6 7 8 9 |
public void openLoginActivity(View view) { Intent intent = new Intent(this, Login.class); startActivity(intent); } public void openSignUpActivity(View view) { Intent intent = new Intent(this, SignUp.class); startActivity(intent); } |
Cambiar la clase padre de Login.java y Registro.java de AppCompatActivity a Actividad.
En res/values/styles.xml (v21)cambia el tema principal a Theme.AppCompat.Light.DarkActionBar.
Abrir activity_sign_up.xml y añada lo siguiente dentro de RelativeLayout etiqueta:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<button style="?android: attr/borderlessButtonStyle;"> </button> |
Ahora ejecute la aplicación y seleccione la opción Inscribirse verá los elementos EditText de Material Design.
Crear una nueva clase java llamada NetworkHelper con lo siguiente:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); OkHttpClient client = new OkHttpClient(); Call post(String url, String json, Callback callback) { RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(url) .post(body) .build(); Call call = client.newCall(request); call.enqueue(callback); return call; } |
Antes de poder realizar peticiones HTTP en tu aplicación Android, primero tienes que añadir la propiedad Red permiso en AndroidManifest.xml:
|
1 |
Ahora de vuelta en Registro.javaañade las siguientes propiedades:
|
1 2 3 4 5 |
NetworkHelper networkHelper = new NetworkHelper(); EditText nameInput; EditText passwordInput; EditText confirmPasswordInput; |
Fije el EditarTexto componentes en el onCreate método:
|
1 2 3 |
nameInput = (EditText) findViewById(R.id.nameInput); passwordInput = (EditText) findViewById(R.id.passwordInput); confirmPasswordInput = (EditText) findViewById(R.id.confirmPasswordInput); |
Aplicar la inscríbase en para enviar una solicitud POST a :8000/inscripción con el nombre y la contraseña proporcionados:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public void signup(View view) { if (!passwordInput.getText().toString().equals(confirmPasswordInput.getText().toString())) { Toast.makeText(getApplicationContext(), "The passwords do not match", Toast.LENGTH_LONG).show(); } else { String json = "{"name": "" + nameInput.getText() + "", "password":"" + passwordInput.getText() + ""}"; networkHelper.post("https://10.0.3.2:8000/signup", json, new Callback() { @Override public void onFailure(Request request, IOException e) { } @Override public void onResponse(Response response) throws IOException { String responseStr = response.body().string(); final String messageText = "Status code : " + response.code() + "n" + "Response body : " + responseStr; runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), messageText, Toast.LENGTH_LONG).show(); } }); } }); } } |
Ejecute la aplicación e introduzca un nombre y una contraseña. Si la cuenta de usuario se ha creado correctamente, recibirá un mensaje 201 Creado y debería ver el usuario recién creado en el panel de administración:

Por último, terminemos con la pantalla de inicio de sesión. En activity_login.xmlañada lo siguiente en RelativeLayout:
|
1 2 3 4 5 6 7 8 9 10 |
<button style="?android: attr/borderlessButtonStyle;"> </button> |
Añade las propiedades a Login.java:
|
1 2 3 4 |
NetworkHelper networkHelper = new NetworkHelper(); EditText nameInput; EditText passwordInput; |
Y realice la misma operación de vinculación de vistas en onCreate:
|
1 2 |
nameInput = (EditText) findViewById(R.id.nameInput); passwordInput = (EditText) findViewById(R.id.passwordInput); |
Aplicar la inicio de sesión método:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public void login(View view) { String json = "{"name": "" + nameInput.getText() + "", "password":"" + passwordInput.getText() + ""}"; networkHelper.post("https://10.0.3.2:8000/smarthome/_session", json, new Callback() { @Override public void onFailure(Request request, IOException e) { } @Override public void onResponse(Response response) throws IOException { String responseStr = response.body().string(); final String messageText = "Status code : " + response.code() + "n" + "Response body : " + responseStr; runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), messageText, Toast.LENGTH_LONG).show(); } }); } }); } |
Ejecute la aplicación e inicie sesión con el nombre de usuario y la contraseña que eligió anteriormente. Si la autenticación se ha realizado correctamente, recibirás un código de estado 200 OK:

NOTA: Todos los SDKs de Couchbase Lite tienen un método en el directorio Replicación que toma un nombre y una contraseña y realiza la autenticación por usted, por lo que probablemente no tendrá que hacer esa solicitud POST a /smarthome/sesión.
Conclusión
En este tutorial, ha aprendido a utilizar la API REST de Admin para crear usuarios a través de una pantalla de registro en una aplicación Android.
¡Increible post! Tengo una duda, ¿Cómo puedo conectar Couchbase Sync Gateway a otro repositorio como directorio activo, etc. o hay una manera de obtener un inicio de sesión único entre Sync Gateway y Couchbase Server?