2009-12-13 15 views
5

Si construí una aplicación que accedió a algunos de los datos de, por ejemplo, Gmail, Twitter y Facebook, y quiero que el usuario solo tenga que ingresar su información de autenticación una vez, y restablecer después de algunos días o semanas, ¿cuál es la mejor manera de hacer esto, dinámicamente, en Ruby?Almacenamiento de contraseñas para API externas: mejor práctica

Veo una gran cantidad de personas sólo tienen un archivo de configuración de las credenciales de sus Clientes/usuarios ', así:


gmail_account: username: myClient password: myClientsPassword 

Esto parece a) como que es muy inseguro, y b) que wouldn' Funcionó si quería almacenar este tipo de información para miles de usuarios. cual es la manera recomendada para hacer esto?

Me gustaría poder construir una interfaz sobre estos servicios, por lo que no es posible tener que ingresar credenciales cada vez que el usuario realiza una transacción.

Respuesta

6

Si es compatible con la responsabilidad potencial cuando un pirata informático entra en su base de datos/sistema de archivos, entonces hágalo. Y para ser justos, también debe revelar a sus usuarios que sus contraseñas se almacenarán en su sistema, y ​​dejar que decidan si quieren darle a su programa ese nivel de confianza.

¿Pero por qué hacer esto en primer lugar? Facebook Connect y Twitter & Google utilizando OAuth no es necesario que almacene contraseñas de usuario. En algún momento, las cookies de un usuario caducarán (o intentarán acceder a su sitio desde otra computadora) y deberán volver a autenticarse. No puede evitar la reautenticación; en su lugar, debe hacer que sea tan fácil de manejar para el usuario final como sea posible.

1

Esta es la forma en que funciona, por ejemplo, para fetcmailrc que tiene que ser chmod a 600 (se puede leer y escribir solo por su propietario). Y sí, contiene la contraseña simple.

6

Dichos servicios proporcionan la autorización OpenAuth. Se recomienda encarecidamente echarle un vistazo.

2

Seguridad

Asumo la aplicación necesita conocer la contraseña en texto plano. Entonces no hay forma de almacenarlo de alguna manera simple.

  • Almacenar de alguna forma codificada, por ejemplo. Base64, esto lo protege de conocer la contraseña al mirar a través de la base de datos con la vista, pero no lo protege de ninguna otra cosa.
  • Asegúrese de que los archivos no son legibles por ningún otro usuario
  • Encripte su disco duro, para que nadie pueda obtener las contraseñas de robar su disco duro. Su computadora requerirá ingresar la contraseña durante el arranque.

Almacenamiento

No hay nada malo con el almacenamiento de datos tanto en su sistema de archivos. Para un mejor rendimiento que puede hacer lo siguiente

  • Un archivo para cada usuario, por lo que el sistema de archivos y no rubí tiene que buscar los datos
  • hacer un montón de subdirectorys. El rendimiento de algunos sistemas de archivos se resiente si los pones en muchos archivos en un directorio. p.ej.poner el 'ABCD' archivo en 'a/b/c/d'

Se puede usar una base de datos en lugar del sistema de archivos

0

Me gustaría sugerir fuertemente que usted utilice OAuth, pero si usted tiene que almacenar las contraseñas (por favor sea absolutamente asegúrese de que necesita hacerlo) podría usar la biblioteca OpenSSL para encriptar las contraseñas. La biblioteca OpenSSL está bastante mal documentada en Ruby, pero hasta donde yo sé, son bastante similares a la biblioteca C OpenSSL. Como creo que debes usar OAuth y no almacenar las contraseñas, te dejaré encontrar la documentación tú mismo.

Sin embargo, para el enfoque de OAuth, desea echar un vistazo al OAuth gem. Google, Twitter (que le recomiendo usar la excelente joya de Twitter para) y Facebook (que tiene dos alternativas aparentemente buenas: RFacebook y facebooker)

Cuestiones relacionadas