Zugangsdaten-Tresor: Geheimnisse ohne Modellkontakt
Hinterlege Portal-Logins so, dass Werte nur im Browser und nur auf einer registrierten Site getippt werden — nie auslesbar, nie in Prompt, Log oder Replay.
Zuletzt aktualisiert:
Entworfen um das, was er verweigert
Der Tresor hat keinen Auslese-Endpunkt und wird nie einen bekommen; die Liste liefert ausschließlich Feldnamen. Die URL, die du beim Anlegen setzt, bestimmt die eine registrierbare Site, auf der der Datensatz je getippt werden darf — ein Login für portal.example.com wird nirgendwo sonst freigegeben.
Auch der Planner berührt nie einen Wert. Er sieht opake Platzhalter, und ein Platzhalter ohne passende Tresor-Freigabe wird schlicht verweigert statt wörtlich getippt. Aufgelöst wird erst im Browser, im Moment des Tippens — deshalb landet ein Passwort nie in einem Prompt, einer Log-Zeile oder einem Session-Replay.
Anlegen und Auflisten über die API
Voraussetzungen: api-key kek
BASE="https://browserberg.com"
AUTH="Authorization: Bearer $BROWSERBERG_API_KEY"
JSON="Content-Type: application/json"
# Create: the URL defines the only site this credential may ever be typed on.
curl -s -X POST "$BASE/v1/credentials" -H "$AUTH" -H "$JSON" -d '{
"name": "Example portal",
"url": "https://portal.example.com/login",
"fields": { "username": "buchhaltung@firma.example", "password": "not-a-real-password" },
"nonSecretFields": ["username"]
}' | python3 -m json.tool
# List: field NAMES only. There is no read-back endpoint, by design.
curl -s "$BASE/v1/credentials" -H "$AUTH" \
| python3 -c 'import json,sys; print(json.dumps(json.load(sys.stdin)["credentials"], indent=2))'
{
"credential": {
"id": "cred_xxxxxxxx",
"name": "Example portal",
"grantUrl": "https://portal.example.com/login",
"fields": [
"username",
"password"
],
"hasTotp": false,
"nonSecretFields": [
"username"
],
"createdAt": "2026-01-01T00:00:00.000Z",
"lastUsedAt": null,
"revokedAt": null
}
}
[
{
"id": "cred_xxxxxxxx",
"name": "Example portal",
"grantUrl": "https://portal.example.com/login",
"fields": [
"password",
"username"
],
"hasTotp": false,
"nonSecretFields": [
"username"
],
"createdAt": "2026-01-01T00:00:00.000Z",
"lastUsedAt": null,
"revokedAt": null
},
{
"id": "cred_xxxxxxxx",
"name": "Example portal",
"grantUrl": "https://portal.example.com/login",
"fields": [
"password",
"username"
],
"hasTotp": false,
"nonSecretFields": [
"username"
],
"createdAt": "2026-01-01T00:00:00.000Z",
"lastUsedAt": null,
"revokedAt": null
},
{
"id": "cred_xxxxxxxx",
"name": "Example portal",
"grantUrl": "https://portal.example.com/login",
"fields": [
"password",
"username"
],
"hasTotp": false,
"nonSecretFields": [
"username"
],
"createdAt": "2026-01-01T00:00:00.000Z",
"lastUsedAt": null,
"revokedAt": null
},
{
"id": "cred_xxxxxxxx",
"name": "Example portal",
"grantUrl": "https://portal.example.com/login",
"fields": [
"password",
"username"
],
"hasTotp": false,
"nonSecretFields": [
"username"
],
"createdAt": "2026-01-01T00:00:00.000Z",
"lastUsedAt": null,
"revokedAt": null
},
{
"id": "cred_xxxxxxxx",
"name": "Example portal",
"grantUrl": "https://portal.example.com/login",
"fields": [
"password",
"username"
],
"hasTotp": false,
"nonSecretFields": [
"username"
],
"createdAt": "2026-01-01T00:00:00.000Z",
"lastUsedAt": null,
"revokedAt": null
}
]
TOTP, Nutzung und Widerruf
Verlangt ein Portal Einmalcodes, gib beim Anlegen einen totpSeed mit; Codes werden serverseitig aus dem Seed erzeugt, sobald ein Login einen braucht — für den Seed gilt also dieselbe Regel wie für jedes andere Feld: Er verlässt den Tresor nie.
Genutzt werden Zugangsdaten an zwei Stellen: in act-Anfragen über credentialIds und im login-Block eines Workflows. DELETE /v1/credentials/:id ist der Widerruf — der Datensatz ist danach nicht mehr nutzbar, und genau darauf kommt es an.
Hinweis · Self-Hosted: ein Key-Provider ist Pflicht
In einer selbst gehosteten Umgebung braucht der Tresor einen Key-Provider — OVHcloud KMS oder, außerhalb der Produktion, einen lokalen KEK. Fehlt er, antworten die Credential-Endpunkte mit 503 capacity_unavailable und nennen die fehlende Konfiguration.
Hinweis · Im Dashboard
Die Ansicht Anmeldedaten listet Zugangsdaten nach Name und Metadaten, legt welche mit ihren Feldern und optionalem TOTP-Seed an und widerruft. Anlegen und Widerrufen sind Owner-Aktionen; ein Mitglied sieht die Liste. Ein Wert wird nie zurückgelesen, weder dort noch hier.