IIC3745-2020-2 / syllabus

Repositorio principal para el curso Testing 2020-2
16 stars 2 forks source link

Setup proyecto: development.key #14

Closed josefinalliende closed 4 years ago

josefinalliende commented 4 years ago

Hola!

En las instrucciones de setup del repositorio de ejemplo sale que tenemos que copiar el archivo development.key dentro de la carpeta config/credentials. Tengo algunas dudas sobre este archivo:

rasaffie commented 4 years ago

Hola!

No debí haber agregado ese paso al README. Por ahora no es necesario que agreguen ese archivo (y quizás no sea necesario para el contexto del curso). Sin embargo aprovecharé de explicar el concepto de credentials en RoR que es interesante y extrapolable a cualquier aplicación.

En general las aplicaciones utilizan servicios externos que son pagados (como por ejemplo AWS S3 para storage de archivos). Para acceder a estos servicios se debe enviar un token (o credenciales) que sirve para autenticarse como la cuenta que pagó por el servicio. Estas credenciales deben ser secretas para limitar la cantidad de personas que tienen acceso a estos servicios privados.

Por defecto, al generar un nuevo proyecto de RoR se crean los archivos config/credentials.yml.enc (que se utiliza para almacenar credenciales de manera encriptada) y el archivo config/master.key (que se utiliza como llave para encriptar y desencriptar el archivo de credenciales). De esta manera, es importante guardar de forma segura solamente el archivo master.key para que ninguna credencial que utiliza la aplicación se filtre. El contenido del archivo encriptado se debe editar a través del comando rails credentials:edit.

En RoR 6 se introdujo el concepto de credenciales encriptadas por ambiente de la aplicación (development, test y production). La lógica es igual a la descrita anteriormente, solamente que los archivos generados por ambiente están dentro de la carpeta config/credentials. Para generar las llaves y editar los archivos para cada ambiente se debe ejecutar el comando rails credentials:edit --environment X, con X el ambiente en específico. Dependiendo del valor de la variable de ambiente RAILS_ENV la aplicación decidirá qué llave utilizar para leer qué credenciales (siendo por defecto credentials.yml.enc y master.key). De esta forma es fácil compartir credenciales con el equipo de desarrollo al pedirles que copien el archivo config/credentials/development.key, o versionar y almacenar de forma segura las credenciales de producción.

En otros frameworks (o versiones anteriores de RoR) se logra ocultar estas credenciales sensibles a través de variables de ambiente, pero estas son menos convenientes de administrar y almacenar.

Como por ahora su aplicación no utiliza servicios externos, no se accede en el código a ninguna credencial a través de Rails.application.credentials, por lo que su aplicación funciona a pesar de que el archivo config/credencials.yml.enc esté vacío o que no hayan copiado ninguna llave.

P.D.: Te felicito por preguntar sobre este tema. Demuestra que quieres entender lo que estás haciendo en vez de copiar la configuración que les entregué, y por eso me di el tiempo de responder en detalle.


Recursos adicionales:

josefinalliende commented 4 years ago

Muchas gracias profesor por la respuesta tan detallada! Me queda mucho más claro ahora :)