python - management - Almacenar los secretos(contraseñas) en un archivo separado
use config file python (2)
¿Cuál es la forma más sencilla de almacenar los secretos de la aplicación (contraseñas, tokens de acceso) para un script de Python? Pensé que sería un archivo *.yml
como en Ruby pero sorprendentemente descubrí que no era el caso. Entonces, que es? ¿Cuáles son las soluciones más simples?
Quiero ponerlos en un archivo separado porque de esa manera no podré enviar ese archivo a un repositorio de github.
Creo que almacenar las credenciales dentro de otro archivo * py es tu apuesta más segura. Entonces simplemente importarlo. Ejemplo se vería así
config.py
username = "xy"
password = "abcd"
main.py
import config
login(config.username, config.password)
Estaba tratando exactamente la misma pregunta y, de hecho, terminé con la misma solución que sugirió kecer . Ya que necesito usar docenas de scripts, he creado una biblioteca propia. Déjame compartir esta solución contigo.
credlib.py - biblioteca universal para manejar credenciales
class credential:
def __init__(self, hostname, username, password):
self.hostname = hostname
self.username = username
self.password = password
mycredentials.py - mi archivo local para almacenar todas las credenciales
from credlib import credential
sys_prod = credential("srv01", "user", "pass")
sys_stg = credential("srv02", "user", "pass")
sys_db = credential("db01", "userdb", "passdb")
mysystemlib.py : esta es una biblioteca general para acceder a mi sistema (tanto el nuevo sistema de credenciales como el legado son compatibles)
from credlib import credential
def system_login(*args): # this is new function definition
#def system_login(hostname, username, password): # this was previous function definition
if len(args) == 1 and isinstance(args[0], credential):
hostname = args[0].hostname
username = args[0].username
password = args[0].password
elif len(args) == 3:
hostname = args[0]
username = args[1]
password = args[2]
else:
raise ValueError(''Invalid arguments'')
do_login(hostname, username, password) # this is original system login call
main.py - script principal que combina credenciales y librerías del sistema
from mycredentials import sys_stg, sys_db
import mysystemlib
...
mysystemlib.system_login(sys_stg)
Tenga en cuenta que la forma heredada de nombre de host / nombre de usuario / contraseña todavía funciona, por lo que no afecta a los scripts antiguos:
mysystemlib.system_login("srv02", "user", "pass")
Esto tiene muchos beneficios:
- El mismo sistema de credenciales en todos nuestros scripts de Python
- Los archivos con contraseñas están separados (los archivos pueden tener permisos más estrictos)
- los archivos no se almacenan en nuestros repositorios git (excluidos a través de
.gitignore
), por lo que nuestros scripts / libs de python se pueden compartir con otros sin exponer credenciales (todos definen sus propias credenciales en sus archivos locales) - Si es necesario cambiar una contraseña, lo hacemos en un solo lugar.