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
usuarios
campo. - 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:
http://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 |
~/Descargas/couchbase-sincronizar-pasarela/papelera/sync_gateway --ayuda Utilización de /Usuarios/jamesnocentini/Descargas/couchbase-sincronizar-pasarela/papelera/sync_gateway: -adminInterface="127.0.0.1:4985": Dirección a vincular admin interfaz a -cubo="sync_gateway": Nombre de cubo -configServer="": URL de servidor que puede devolver base de datos configs -dbname="": Nombre de Couchbase Servidor base de datos (valores predeterminados a nombre de cubo) -deploymentID="": Cliente/proyecto identificador para Estadísticas información -interfaz=":4984": Dirección a vincular a -registro="": Registro palabras clave, coma separado -logFilePath="": Ruta a registro archivo -personaOrigin="": Base URL que clientes utilice a conecte a el servidor -piscina="por defecto": Nombre de piscina -bonito=falso: Pretty-imprimir JSON respuestas -perfilInterfaz="": Dirección a vincular perfil interfaz a -url="morsa:": Dirección de Couchbase servidor -verbose=falso: Registro más información acerca de solicita |
Para este tutorial, se especificará el dbname
, interfaz
, bonito
y url
:
1 |
~/Descargas/couchbase-sincronizar-pasarela/papelera/sync_gateway -dbname="smarthome" -interfaz="0.0.0.0:4984" -bonito="true" -url="morsa:" |
Para crear un usuario, puede ejecutar lo siguiente en su terminal:
1 2 3 |
$ rizo -vX POST -H Content-Type: application/json' -d '{"nombre": "adam", "contraseña": "letmein"}' :4985/smarthome/Usuario/ |
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 |
$ rizo -vX POST -H Content-Type: application/json' -d '{"nombre": "adam", "contraseña": "letmein"}' :4984/smarthome/_sesión |
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 instale express cuerpo-analizador solicitar http-proxy --guardar |
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 = requiere(exprés) , bodyParser = requiere('body-parser') , solicitar = requiere(solicitud).valores predeterminados({json: verdadero}) , httpProxy = requiere(http-proxy); // 1 var aplicación = express(); aplicación.utilice(/inscripción, bodyParser.json()); // 2 aplicación.Correo electrónico:(/inscripción, función (consulte, res) { consola.registro(es hora de inscribirse); var json = consulte.cuerpo; var opciones = { url: http://0.0.0.0:4985/smarthome/_user/, método: POST, cuerpo: json }; solicitar(opciones, función(error, respuesta) { res.writeHead(respuesta.statusCode); res.fin(); }); }); // 3 aplicación.todos('*', función(consulte, res) { var url = 'http://0.0.0.0:4984' + consulte.url; consulte.tubo(solicitar(url)).tubo(res); }); // 4 var servidor = aplicación.escuche(8000, función () { var host = servidor.dirección().dirección; var puerto = servidor.dirección().puerto; consola.registro(App a la escucha en http://%s:%s, host, puerto); }); |
Esto es lo que ocurre paso a paso:
- Instanciar una nueva instancia de express y utilizar la función
bodyParser
só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ón
y 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:
http://localhost:8000
Cree otro usuario para comprobar que todo funciona como se espera:
1 2 3 |
$ rizo -vX POST -H Content-Type: application/json' -d '{"nombre": "andy", "contraseña": "letmein"}' :8000/inscríbase en/ |
Y para iniciar sesión como este usuario:
1 2 3 |
$ rizo -vX POST -H Content-Type: application/json' -d '{"nombre": "andy", "contraseña": "letmein"}' :8000/smarthome/_sesión |
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ón
y/smarthome/sesión
.
En build.gradle
añade esas dependencias:
1 2 |
compilar com.android.support:design:22.2.1 compilar com.squareup.okhttp:okhttp:2.3.0' |
En actividad_bienvenida.xml
añada lo siguiente LinearLayout en el interior del RelativeLayout:
1 2 3 4 |
<botón estilo="android: attr/borderlessButtonStyle;"> </botón><botón estilo="android: attr/borderlessButtonStyle;"> </botón> |
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 |
público void openLoginActivity(Ver ver) { Intención intento = nuevo Intención(este, Inicio de sesión.clase); startActivity(intento); } público void openSignUpActivity(Ver ver) { Intención intento = nuevo Intención(este, Regístrese en.clase); startActivity(intento); } |
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 |
<botón estilo="android: attr/borderlessButtonStyle;"> </botón> |
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 |
público estático final MediaType JSON = MediaType.analizar("application/json; charset=utf-8"); OkHttpClient cliente = nuevo OkHttpClient(); Llame a Correo electrónico:(Cadena url, Cadena json, Devolución de llamada devolución de llamada) { RequestBody cuerpo = RequestBody.crear(JSON, json); Solicitar solicitar = nuevo Solicitar.Constructor() .url(url) .Correo electrónico:(cuerpo) .construya(); Llame a llame a = cliente.newCall(solicitar); llame a.poner en cola(devolución de llamada); devolver llame a; } |
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.java
añade las siguientes propiedades:
1 2 3 4 5 |
NetworkHelper networkHelper = nuevo NetworkHelper(); EditarTexto nombreEntrada; EditarTexto passwordInput; EditarTexto confirmPasswordInput; |
Fije el EditarTexto componentes en el onCreate
método:
1 2 3 |
nombreEntrada = (EditarTexto) findViewById(R.id.nombreEntrada); passwordInput = (EditarTexto) findViewById(R.id.passwordInput); confirmPasswordInput = (EditarTexto) 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 |
público void inscríbase en(Ver ver) { si (!passwordInput.getText().toString().es igual a(confirmPasswordInput.getText().toString())) { Tostadas.makeText(getApplicationContext(), "Las contraseñas no coinciden", Tostadas.LENGTH_LONG).Mostrar(); } si no { Cadena json = "{"nombre": "" + nameInput.getText() + "", "contraseña":"" + passwordInput.getText() + ""}"; networkHelper.Correo electrónico:("http://10.0.3.2:8000/signup", json, nuevo Devolución de llamada() { @Anular público void onFailure(Solicitar solicitar, IOException e) { } @Anular público void onResponse(Respuesta respuesta) lanza IOException { Cadena respuestaStr = respuesta.cuerpo().cadena(); final Cadena mensajeTexto = "Código de estado : " + respuesta.código() + "n" + "Cuerpo de la respuesta : " + respuestaStr; runOnUiThread(nuevo Ejecutable() { @Anular público void ejecute() { Tostadas.makeText(getApplicationContext(), mensajeTexto, Tostadas.LENGTH_LONG).Mostrar(); } }); } }); } } |
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.xml
añada lo siguiente en RelativeLayout:
1 2 3 4 5 6 7 8 9 10 |
<botón estilo="android: attr/borderlessButtonStyle;"> </botón> |
Añade las propiedades a Login.java
:
1 2 3 4 |
NetworkHelper networkHelper = nuevo NetworkHelper(); EditarTexto nombreEntrada; EditarTexto passwordInput; |
Y realice la misma operación de vinculación de vistas en onCreate
:
1 2 |
nombreEntrada = (EditarTexto) findViewById(R.id.nombreEntrada); passwordInput = (EditarTexto) 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 |
público void inicio de sesión(Ver ver) { Cadena json = "{"nombre": "" + nameInput.getText() + "", "contraseña":"" + passwordInput.getText() + ""}"; networkHelper.Correo electrónico:("http://10.0.3.2:8000/smarthome/_session", json, nuevo Devolución de llamada() { @Anular público void onFailure(Solicitar solicitar, IOException e) { } @Anular público void onResponse(Respuesta respuesta) lanza IOException { Cadena respuestaStr = respuesta.cuerpo().cadena(); final Cadena mensajeTexto = "Código de estado : " + respuesta.código() + "n" + "Cuerpo de la respuesta : " + respuestaStr; runOnUiThread(nuevo Ejecutable() { @Anular público void ejecute() { Tostadas.makeText(getApplicationContext(), mensajeTexto, Tostadas.LENGTH_LONG).Mostrar(); } }); } }); } |
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?