Synit ADProxy

API und Templates

HTTP-, Webhook-, JSON-RPC- und Template-Beispiele für Synit ADProxy: Endpunkte, Authentifizierung, Idempotenz, Operationen und Schema-Diagnose.

API und Templates

ADProxy kann über HTTP JSON, JSON-RPC, Webhook-Flows und JSONata-Templates in Enterprise Active Directory (AD) integriert werden. Alle schreibenden Pfade nutzen denselben Plan/Apply-Kern.

Ausführliche Payload-Beispiele stehen zusätzlich unter Synit ADProxy Beispiele.

Wichtige HTTP-Endpunkte im Überblick

Methode Pfad Zweck
POST /api/v1/mutations/plan Änderung planen, ohne zu schreiben
POST /api/v1/mutations/apply freigegebenen Plan anwenden
POST /api/v1/mutations Plan und Apply in einem Request
GET /api/v1/mutations Mutation Journals und laufende Pläne listen
GET /api/v1/mutations/{id} Ergebnis oder Journal abrufen
POST /api/v1/mutations/{id}/resume unterbrochene Mutation aus Journal wieder aufnehmen
POST /api/v1/query read-only Active-Directory-Abfrage
GET /api/v1/objects Objekte per Base DN und Filter suchen
GET /api/v1/objects/{dn} einzelnes Objekt per DN lesen
GET /api/v1/schema API-Schema abrufen
POST /api/v1/templates/{name}/render Template nur rendern
POST /api/v1/templates/{name}/plan Template rendern und planen
POST /api/v1/templates/{name}/mutations Template rendern, planen und anwenden
POST /api/v1/rpc JSON-RPC 2.0 für Plan, Apply und Plan-and-Apply
GET /api/v1/schema/classes/{name} Active-Directory-Klassenmetadaten abrufen
GET /api/v1/schema/attributes/{name} Attributmetadaten abrufen
POST /api/v1/admin/tokens/revoke Client-ID bis zum Neustart live sperren
GET /readyz Readiness für Load Balancer und Betrieb prüfen

Authentifizierung

Die HTTP API unterstützt getrennte read-only und read-write Clients.

Schema Beispiel
Bearer Token Authorization: Bearer <token>
Bearer mit Client-ID Authorization: Bearer workflow-writer:<secret>
Bearer Base64 Authorization: Bearer <base64(client_id:secret)>
Basic Auth Authorization: Basic <base64(client_id:secret)>

read-only Clients dürfen GET Requests, POST /api/v1/query und POST /api/v1/mutations/plan nutzen. Apply und kombinierte Mutation Requests benötigen einen read-write Client.

Idempotenz

Für kombinierte Plan-and-Apply-Requests kann ein Idempotency-Key gesetzt werden:

curl -sS -X POST https://adproxy.example.test/api/v1/mutations \
  -H "Authorization: Bearer <write-token>" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: onboard-jane-2026-07-02" \
  -d '{ "mutation_id": "onboard-jane", "operations": [] }'

Wiederholte Requests mit gleichem Key und gleichem Body liefern dasselbe Ergebnis zurück. Gleicher Key mit anderem Body wird abgelehnt. Das schützt vor doppelten Workflow- oder Netzwerk-Retries.

Detailgrad der Antworten

Mutation Requests können response_detail setzen:

Wert Einsatz
summary kompakte Antwort für einfache Integrationen
standard normale Plan-/Apply-Details
verbose erweiterte Details für Review, Diagnose und Pilotphasen

Für fachliche Freigabe und erste Integrationen ist standard oder verbose sinnvoll. Für stabile Automationen kann summary reichen.

Unterstützte Operationen

Häufige Operationen:

create_user create_group modify_attributes set_password unlock enable_account disable_account add_group_member remove_group_member move_object rename_object delete_object set_manager set_primary_group update_account_settings lookup_object

Ein Request muss genau einen Stil nutzen: entweder operations, oder genau eine Desired-State-Liste wie desired_users, desired_groups oder desired_objects. Mischen wird abgelehnt.

Zentrale Request-Felder

Feld Zweck
mutation_id optionales Caller-Label für Nachvollziehbarkeit
actor Mensch oder Service, der den Vorgang auslöst
source Quellsystem, zum Beispiel service-desk, iam-workflow oder mcp-draft
target_dc optionaler Domain Controller für deterministische Planung
force Freigabe für force-pflichtige Operationen
approval Approval-Metadaten, wenn die Policy das verlangt
show_secret_outputs generierte Secrets in der Apply-Antwort anzeigen
response_detail Antworttiefe: summary, standard oder verbose
operations explizite Operationen
desired_users gewünschter Benutzer-Zielzustand
desired_groups gewünschter Gruppen-Zielzustand
desired_objects gewünschter Objekt-Zielzustand

Beispiel: User Onboarding

{
  "mutation_id": "onboard-jane",
  "actor": "alice@example.test",
  "source": "iam-workflow",
  "operations": [
    {
      "id": "create_jane",
      "operation_type": "create_user",
      "target": {
        "dn": "CN=Jane Doe,OU=Users,DC=example,DC=test"
      },
      "object_class": "user",
      "attributes": {
        "cn": "Jane Doe",
        "givenName": "Jane",
        "sn": "Doe",
        "displayName": "Jane Doe",
        "sAMAccountName": "jdoe",
        "userPrincipalName": "jdoe@example.test",
        "mail": "jane.doe@example.test"
      }
    },
    {
      "id": "add_jane_to_group",
      "operation_type": "add_group_member",
      "target": {
        "dn": "CN=Engineering Users,OU=Groups,DC=example,DC=test"
      },
      "object_class": "group",
      "member_dn": "CN=Jane Doe,OU=Users,DC=example,DC=test",
      "depends_on": ["create_jane"]
    }
  ]
}

Beispiel: Account-Einstellungen

{
  "mutation_id": "jane-account-settings",
  "actor": "alice@example.test",
  "force": true,
  "operations": [
    {
      "id": "disable_user",
      "operation_type": "disable_account",
      "target": {
        "dn": "CN=Jane Doe,OU=Users,DC=example,DC=test"
      },
      "object_class": "user"
    },
    {
      "id": "move_to_disabled_ou",
      "operation_type": "move_object",
      "target": {
        "dn": "CN=Jane Doe,OU=Users,DC=example,DC=test"
      },
      "object_class": "user",
      "new_parent": "OU=Disabled Users,DC=example,DC=test",
      "depends_on": ["disable_user"]
    }
  ]
}

Templates

Templates sind JSON-Dateien, die mit Variablen gerendert werden. Sie sind geeignet für wiederkehrende Abläufe wie Onboarding, Offboarding oder Gruppenänderungen.

Beispiel user_onboarding.template.json:

{
  "name": "user_onboarding",
  "payload": {
    "mutation_id": "{{ $mutation_id }}",
    "actor": "{{ $actor }}",
    "operations": [
      {
        "id": "create_user",
        "operation_type": "create_user",
        "object_class": "user",
        "target": {
          "dn": "CN={{ $display_name }},{{ $ou_dn }}"
        },
        "attributes": {
          "cn": "{{ $display_name }}",
          "givenName": "{{ $given_name }}",
          "sn": "{{ $surname }}",
          "sAMAccountName": "{{ $user_name }}",
          "mail": "{{ $user_name }}@example.test",
          "department": "{{ $department }}"
        }
      }
    ]
  }
}

Rendern:

curl -sS -X POST https://adproxy.example.test/api/v1/templates/user_onboarding/render \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "mutation_id": "onboard-jane",
    "actor": "alice@example.test",
    "display_name": "Jane Doe",
    "given_name": "Jane",
    "surname": "Doe",
    "user_name": "jdoe",
    "department": "Engineering",
    "ou_dn": "OU=Users,DC=example,DC=test"
  }'

Planen:

curl -sS -X POST https://adproxy.example.test/api/v1/templates/user_onboarding/plan \
  -H "Authorization: Bearer <read-or-write-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "mutation_id": "onboard-jane",
    "actor": "alice@example.test",
    "display_name": "Jane Doe",
    "given_name": "Jane",
    "surname": "Doe",
    "user_name": "jdoe",
    "department": "Engineering",
    "ou_dn": "OU=Users,DC=example,DC=test"
  }'

Render, Plan und Apply in einem Schritt:

curl -sS -X POST https://adproxy.example.test/api/v1/templates/user_onboarding/mutations \
  -H "Authorization: Bearer <write-token>" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: onboard-jane-template-2026-07-01" \
  -d '{
    "mutation_id": "onboard-jane",
    "actor": "alice@example.test",
    "display_name": "Jane Doe",
    "given_name": "Jane",
    "surname": "Doe",
    "user_name": "jdoe",
    "department": "Engineering",
    "ou_dn": "OU=Users,DC=example,DC=test"
  }'

Regeln für Templates

Keine Secrets in Templates speichern. Von Active Directory generierte Attribute wie objectGUID, objectSid, whenChanged, uSNChanged oder memberOf nicht schreiben. Passwortmaterial nur über abgestimmte sichere Wege behandeln. Offboarding konservativ halten: zuerst deaktivieren, dann bekannte Gruppen entfernen, danach verschieben. Templates versionieren und fachlich freigeben.

JSON-RPC

JSON-RPC nutzt denselben Plan/Apply-Kern wie die HTTP Endpunkte.

Methode Zweck
mutation.plan Plan erzeugen
mutation.apply freigegebenen Plan anwenden
mutation.plan_and_apply planen und direkt anwenden

Beispiel:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "mutation.plan",
  "params": {
    "actor": "alice@example.test",
    "operations": [
      {
        "id": "add_member",
        "operation_type": "add_group_member",
        "target": {
          "dn": "CN=Engineering Users,OU=Groups,DC=example,DC=test"
        },
        "object_class": "group",
        "member_dn": "CN=Jane Doe,OU=Users,DC=example,DC=test"
      }
    ]
  }
}

Schema-Diagnose

Schema-Endpunkte helfen Integrationen und Agenten, gültige Requests zu bauen.

curl -sS -u "<client-id>:<secret>" https://adproxy.example.test/api/v1/schema
curl -sS -u "<client-id>:<secret>" https://adproxy.example.test/api/v1/schema/classes/user
curl -sS -u "<client-id>:<secret>" https://adproxy.example.test/api/v1/schema/attributes/sAMAccountName
United in Diversity