pavel-kalmykov / mantecabox

Servicio de almacenamiento de ficheros seguro en la nube para la asignatura de Seguridad en el Diseño de Software
GNU General Public License v3.0
2 stars 1 forks source link

Registrar y autenticar usuarios desde el cliente #7

Closed pavel-kalmykov closed 6 years ago

pavel-kalmykov commented 6 years ago

Descripción

Como el servidor tendrá un servicio de usuarios, tendremos que implementar la comunicación -el consumo de ese servicio- desde el cliente.

La intención es que el cliente inicialmente actúe como CLI que reciba comandos por argumentos y realice las acciones asociadas a los mismos.

Condiciones de satisfacción

  1. [x] Deberemos de tener terminada las issue #5 y #12.
  2. [x] Para el registro:
    1. [x] Ejecutamos mbox signup.
    2. [x] Nos pide un nuevo nombre de usuario.
    3. [x] Nos pide una nueva contraseña (pero no la muestra por pantalla).
    4. [x] Nos devuelve el mensaje de respuesta del servidor.
  3. [x] Para el login:
    1. [x] Ejecutamos mbox login
    2. [x] Nos pide nuestro nombre de usuario.
    3. [x] Nos pide nuestra contraseña (pero no la muestra por pantalla).
    4. [x] Nos devuelve un JSON con una un token JWT o un error de servidor seguido de la razón del mismo en caso de que el login haya sido exitoso o no.
    5. [x] Una vez se loguee el usuario, guardaremos la respuesta del servidor en el keychain como un JSON. Así, para cuando se quieran realizar otras operaciones (listar ficheros, subir ficheros, descargar ficheros...), obtendrá el token del keychain y realizará la petición al servidor. En caso de no tener token, aparecería un error.
  4. [x] Deberemos de comprobar que los comandos a introducir son los correctos; en caso de introducir un comando no existente (o no introducir ninguno), mostrar un mensaje diciendo que el comando no existe (o que no se ha introducido ninguno) y mostrar el comando de ayuda (mbox help) que mostrará los comandos disponibles y una descripción de lo que hace cada uno. Si ejecutamos el comando de ayuda, no mostraremos ningún error, tan sólo la propia ayuda.
  5. [x] Aunque ya lo estemos haciendo desde el servicio, aquí también validaremos las entradas a través de expresiones regulares comunes para nombres de usuario y contraseñas.
  6. [x] Deberemos de comprobar la disponibilidad del servidor; en caso de no poder establecer comunicación con el mismo, terminaremos el programa con un mensaje descriptivo (como, por ejemplo, "No se ha podido establecer comunicación con el servidor. Por favor, inténtalo más tarde.". Otras propuestas son bienvenidas.

Referencias

pavel-kalmykov commented 6 years ago

Sobre pedir contraseña al usuario: https://stackoverflow.com/questions/2137357/getpasswd-functionality-in-go

pavel-kalmykov commented 6 years ago

Para el parseo de argumentos vamos a usar https://github.com/alexflint/go-arg

pavel-kalmykov commented 6 years ago

Para comprobar la seguridad de la contraseña, usamos el agoritmo zxcvbn a través de la librería https://github.com/nbutton23/zxcvbn-go

pavel-kalmykov commented 6 years ago

Desarrollando en registro-cliente

pavel-kalmykov commented 6 years ago

@rpairo, al pedir la contraseña, ¿prefieres que se muestren los asteriscos o que no se muestre nada (como cuando te piden la contraseña para el sudo)?

rpairo commented 6 years ago

Personalmente prefiero que se muestren los asteriscos para proporcionar una mejor experiencia de usuario.

pavel-kalmykov commented 6 years ago

Como no podemos almacenar ninguna variable de entorno que se pueda persistir una vez salgamos del programa (como se indica en esta respuesta de StackOverflow https://stackoverflow.com/a/36074920), vamos a guardarlo en el keychain (o llavero) del sistema. Para ello, usaremos la librería https://github.com/zalando/go-keyring. Se ha actualizado la descripción de la issue para conformar esto.