Handbuch Technik API Admin

API-Referenz

Alle REST-Endpoints des PluriKey Servers. Base-URL: http://localhost:8200 (Server) oder http://localhost:8210 (Desktop).

Authentifizierung
Alle Endpoints ausser /auth/login, /auth/init und /vaults erfordern einen Bearer Token im Authorization Header.

Login

POST /api/ext/auth/login

Oeffnet einen Vault mit der Passphrase. Gibt ein Session-Token zurueck.

Request

POST /api/ext/auth/login
Content-Type: application/json

{
  "vault_name": "stefan",
  "passphrase": "meine-sichere-passphrase"
}

Response (200)

{
  "token": "eyJ0eXAiOiJKV1Q...",
  "vault_name": "stefan"
}

Fehler

CodeBedeutung
401Falsche Passphrase
404Vault existiert nicht

Token Refresh

POST /api/ext/auth/refresh

Verlaengert die aktuelle Session. Unterliegt der max_session_secs Obergrenze.

Request

POST /api/ext/auth/refresh
Authorization: Bearer eyJ0eXAiOiJKV1Q...

Response (200)

{
  "token": "eyJ0eXAiOiJKV1Q...",
  "remaining_secs": 28800
}

Logout

POST /api/ext/auth/logout

Beendet die Session, loescht die age Identity aus dem RAM.

Vault erstellen

POST /api/ext/auth/init

Erstellt einen neuen, leeren Vault mit der angegebenen Passphrase.

POST /api/ext/auth/init
Content-Type: application/json

{
  "vault_name": "arbeit",
  "passphrase": "neue-sichere-passphrase"
}

Response (201)

{
  "vault_name": "arbeit",
  "message": "Vault created"
}

Vaults auflisten

GET /api/ext/vaults

Listet alle verfuegbaren Vault-Namen auf. Kein Token erforderlich.

GET /api/ext/vaults

Response (200)

{
  "vaults": ["stefan", "arbeit", "shared"]
}

Eintraege abrufen

GET /api/ext/entries

Gibt alle Eintraege des geoeffneten Vaults zurueck.

GET /api/ext/entries
Authorization: Bearer eyJ0eXAiOiJKV1Q...

Response (200)

[
  {
    "id": "a1b2c3d4",
    "display_name": "GitHub",
    "kvs": [
      { "key": "Title", "value": "GitHub Account", "masked": false },
      { "key": "URL", "value": "https://github.com/login", "masked": false },
      { "key": "UserName", "value": "stlas", "masked": false },
      { "key": "Password", "value": "********", "masked": true },
      { "key": "ShieldType", "value": "Login", "masked": false }
    ],
    "body": ""
  }
]

CRUD Operationen

MethodeEndpointBeschreibung
GET/api/ext/entries/:idEinzelnen Eintrag abrufen
POST/api/ext/entriesNeuen Eintrag erstellen
PUT/api/ext/entries/:idEintrag aktualisieren
DELETE/api/ext/entries/:idEintrag loeschen

Eintrag erstellen (POST)

POST /api/ext/entries
Authorization: Bearer eyJ0eXAiOiJKV1Q...
Content-Type: application/json

{
  "kvs": [
    { "key": "Title", "value": "Neuer Eintrag" },
    { "key": "URL", "value": "https://example.com" },
    { "key": "UserName", "value": "user@example.com" },
    { "key": "Password", "value": "geheim123", "masked": true },
    { "key": "ShieldType", "value": "Login" }
  ],
  "body": ""
}

Entry-Format

Standard Key-Value Felder

KeyZweckMasked
TitleAnzeigename des Eintragsnein
URLLogin-URL fuer Auto-Fill Matchingnein
UserNameBenutzername / E-Mailnein
PasswordPasswortja
NotesFreitext-Notizennein
ShieldTypeTyp: Login, CreditCard, Address, BankAccount, etc.nein

Benutzerdefinierte KVs koennen beliebig hinzugefuegt werden (z.B. CardNumber, TOTP, PIN).

WebAuthn Registrierung

Zwei-Schritt-Prozess: Challenge anfordern, dann Credential registrieren.

POST /api/ext/webauthn/register-begin

// 1. Challenge anfordern
POST /api/ext/webauthn/register-begin
Authorization: Bearer eyJ0eXAiOiJKV1Q...

// Response: PublicKeyCredentialCreationOptions
// → An navigator.credentials.create() uebergeben

POST /api/ext/webauthn/register-finish

// 2. Credential senden
POST /api/ext/webauthn/register-finish
Authorization: Bearer eyJ0eXAiOiJKV1Q...
Content-Type: application/json

// Body: AuthenticatorAttestationResponse (base64url encoded)

WebAuthn Authentifizierung

POST /api/ext/webauthn/auth-begin

POST /api/ext/webauthn/auth-finish

Gleicher Zwei-Schritt-Prozess wie Registrierung, nutzt navigator.credentials.get().

rpID Einschraenkung
WebAuthn erfordert rpID: "localhost". IP-Adressen (z.B. 192.168.x.x) funktionieren nicht mit webauthn-rs. Der Server muss ueber localhost erreichbar sein.

Extension: GET_MATCHES

Findet passende Eintraege fuer eine URL (via chrome.runtime.sendMessage).

// Content Script → Service Worker
chrome.runtime.sendMessage({
  action: "GET_MATCHES",
  url: "https://github.com/login"
}, (response) => {
  // response.entries: Array von passenden Eintraegen
});

Extension: FILL_CREDENTIALS

Fuellt Credentials in das aktive Tab ein.

chrome.runtime.sendMessage({
  action: "FILL_CREDENTIALS",
  entryId: "a1b2c3d4",
  tabId: 123
});

Extension: GENERATE_PASSWORD

Generiert ein Passwort mit den angegebenen Parametern.

chrome.runtime.sendMessage({
  action: "GENERATE_PASSWORD",
  length: 20,
  upper: true,
  lower: true,
  digits: true,
  symbols: true
}, (response) => {
  // response.password: "xK#9mP2&qL..."
});

Extension: COPY_TO_CLIPBOARD

Kopiert einen Wert in die Zwischenablage mit automatischem Loeschen nach Timeout.

chrome.runtime.sendMessage({
  action: "COPY_TO_CLIPBOARD",
  value: "geheim123",
  timeout: 30  // Sekunden bis Auto-Clear
});