Saltar al contenido principal

Conector de Python

El conector de Python de Passwork envuelve la REST API y todas las operaciones criptográficas en una interfaz de Python de alto nivel. Utilícelo cuando necesite más control del que ofrece la CLI de Passwork: operaciones por lotes, lógica condicional, gestión de errores, migraciones o informes personalizados.

La clase principal es PassworkClient. Proporciona acceso a todos los objetos de Passwork —bóvedas, carpetas, elementos, usuarios, grupos, sesiones— y gestiona la renovación de tokens y el CSE de forma transparente.


Instalación

pip install passwork-python

Requisitos:

  • Python 3.10+,
  • requests>=2.31.0
  • cryptography>=42.0.
  • pbkdf2>=1.3

Autenticación

import os
from passwork import Client

client = Client(
url=os.environ["PASSWORK_HOST"],
token=os.environ["PASSWORK_TOKEN"],
refresh_token=os.environ.get("PASSWORK_REFRESH_TOKEN"),
)

Cuando se proporciona refresh_token, el conector renueva el token de acceso automáticamente al caducar. No se necesita gestión manual de tokens en los scripts de larga duración.


Lectura de secretos

Obtener un único elemento por ID

item = client.get_password(item_id="<item_id>")

print(item.name) # item name
print(item.login) # login field
print(item.password) # password field (decrypted if CSE enabled)

Obtener todos los elementos de una carpeta

items = client.get_passwords(folder_id="<folder_id>")

for item in items:
print(f"{item.name}: {item.password}")

Acceder a los campos personalizados

Los campos personalizados están disponibles en el diccionario item.fields, indexados por el nombre del campo:

item = client.get_password(item_id="<item_id>")

aws_key_id = item.login
aws_secret_key = item.fields.get("AWS_SECRET_ACCESS_KEY")
aws_region = item.fields.get("AWS_REGION")

Buscar en todas las bóvedas

results = client.search_passwords(query="postgres")

for item in results:
print(f"{item.name} in vault {item.vault_id}")

El CSE y el MasterKeyManager

Cuando el cifrado del lado del cliente está activado, el componente MasterKeyManager gestiona la derivación de la clave a partir de la clave maestra, el descifrado de la clave privada RSA y el desenvolvimiento de las claves por bóveda y por elemento. El cliente gestiona esto automáticamente cuando se proporciona master_key.

Si necesita derivar la clave maestra a partir de una contraseña maestra (en lugar de proporcionar la clave ya derivada):

from passwork import Client
from passwork.crypto import MasterKeyManager

manager = MasterKeyManager()
master_key = manager.derive_master_key(
password="your_master_password",
salt="<salt_from_user_profile>",
)

client = Client(
url="https://passwork.example.com",
token="<token>",
master_key=master_key,
)

En la práctica, la mayoría de la automatización utiliza la clave PASSWORK_MASTER_KEY ya derivada (que es una cadena de bytes codificada en base64) en lugar de la contraseña maestra sin procesar.


Escritura y actualización de secretos

Actualizar la contraseña de un elemento existente

item = client.get_password(item_id="<item_id>")
item.password = "new_strong_password_here"
client.update_password(item)

Actualizar el valor de un campo personalizado

item = client.get_password(item_id="<item_id>")
item.fields["AWS_SECRET_ACCESS_KEY"] = "new_aws_secret_key"
client.update_password(item)

Crear un nuevo elemento

from passwork.models import PasswordItem

new_item = PasswordItem(
name="Redis sessions",
login="redis",
password="generated_password",
folder_id="<target_folder_id>",
tags=["production", "messaging"],
)
client.create_password(new_item)

Persistencia de sesiones

Para los scripts que se ejecutan con frecuencia, guarde y restaure la sesión para evitar generar un nuevo par de tokens en cada ejecución:

import os
from passwork import Client

session_file = "/tmp/passwork_session.enc"

client = Client(url=os.environ["PASSWORK_HOST"])

if os.path.exists(session_file):
client.load_session(session_file)
else:
client.set_tokens(
token=os.environ["PASSWORK_TOKEN"],
refresh_token=os.environ["PASSWORK_REFRESH_TOKEN"],
)

# ... use client ...

client.save_session(session_file)

Las sesiones guardadas están cifradas. La clave de cifrado se deriva de una combinación de material del token y no se almacena junto al archivo de sesión.


Gestión de errores

from passwork import Client
from passwork.exceptions import PassworkResponseError, PassworkError

try:
item = client.get_password(item_id="<item_id>")
except PassworkResponseError as e:
# HTTP error from the Passwork API (4xx, 5xx)
print(f"API error {e.code}: {e.message}")
except PassworkError as e:
# Client-side error (network, encryption, etc.)
print(f"Client error: {e}")

Códigos de error de la API habituales que conviene gestionar:

CódigoSignificadoAcción
accessTokenExpiredEl token de acceso ha caducadoEl conector lo gestiona automáticamente si se ha configurado el token de renovación
itemNotFoundEl ID del elemento no existeVerifique el ID del elemento o compruebe el acceso a la bóveda
forbiddenLa cuenta de servicio no tiene permisoRevise el nivel de acceso a la bóveda
masterKeyRequiredEl CSE está activado pero no se ha proporcionado la clave maestraAñada master_key al constructor Client()

Método universal call()

Para cualquier endpoint de la API no cubierto por un método específico del conector, utilice call():

# Get activity logs
response = client.call(
method="GET",
endpoint="/api/v1/activity-logs",
params={"limit": 100},
)

# Bulk delete items
response = client.call(
method="POST",
endpoint="/api/v1/items/delete/bulk",
json={"ids": ["id1", "id2", "id3"]},
)

Para consultar la referencia completa de la API, consulte API e integraciones: descripción general.

Para ver más ejemplos del conector de Python, consulte el repositorio de ejemplos de integración.