Skip to content

[Epic] Bidirektionale Kommunikation im Java & .NET-SDK

Warum?

Voraussetzung für dieses Epic ist die Fertigstellung des ~"Epic::Rückkanal" (Bidirektionale Kommunikation zw. Onlinedienst und Fachverfahren) -> Möglichkeit des Fachverfahrenauf Anträge antworten zu können und dann als Onlinedienst diese Antwort zu verarbeiten um ggf. erneut eine Einreichung zu einem bestehenden Vorgang (Case-ID) zu versenden.

Mit der bidirektionalen Kommunikation wurden die Kommunikationsmöglichkeiten von FIT-Connect an der Submission API erweitert. Die Nutzung der neuen Funktionalitäten dieser API soll für Anbindende einfach über ein SDK ermöglicht werden - sowohl für JAVA, .NET.

Relevante Links und Bemerkungen

sequenceDiagram
autonumber
loop Bidirektionale Kommunikation
opt Falls noch kein Key vorhanden
Sender->>Sender: Pro Vorgang (bzw. pro Antragsteller:in) einen Encryption Key für Rückkanal generieren
end
Sender->>Sender: Metadatensatz mit Encryption Key und Angabe zum Prozesstandard generieren
Sender->>Sender: Submission Bestandteile mit dem Public Key der Destination verschlüsseln
alt Falls ein neuer Case angelegt wird
Sender->>Zustelldienst: Submission mit Rückkanaloption anlegen
Zustelldienst->>Zustelldienst: Bidirektionalen Vorgang anlegen
else Falls ein bestehender Case genutzt wird
Sender->>Zustelldienst: Submission für ein bestehenden Case anlegen
end
Sender->>Zustelldienst: Submission übersenden
Zustelldienst->>Subscriber: Einreichung abrufen
Subscriber->>Subscriber: Security Event Token für Accept / Rejectgenerieren
Subscriber->>Zustelldienst: Security Event Token übermitteln
Subscriber->>Subscriber: Prozessstandard und Encryption Key aus dem Metadatenschema entnehmen
Subscriber->>Subscriber: Reply Bestandteile mit dem Encryption Key verschlüsseln
Subscriber->>Zustelldienst: Reply anlegen und übersenden
Zustelldienst->>Sender: Reply abrufen
Sender->>Zustelldienst: Accept oder Reject senden
Zustelldienst->>Zustelldienst: Security Event Token für Accept / Reject generieren
end

Akzeptanzkriterien und Anwendungsfälle

Übergreifende Akzeptanzkriterien:

  • Alle Endpunkte der aktualisierten Submission-API werden über die SDKs nutzbar gemäß der Anwendungsfälle genutzt
  1. Anwendungsfälle in der Rolle des Onlinedienstes (Antwort empfangen)
    1. Encryption Key für Rückkanal generieren, integriert in die Erstellung der Metadaten – im selben Case möglichst gleichen Key wiederverwenden. Vorgaben zur Verschlüsselung https://git.fitko.de/fit-connect/planning/-/issues/654#anforderungen-zur-verschl%C3%BCsselung
      • .NET: encryption Key Generierung ist offen (der erzeugte Key kann aktuell nicht in JWK umgewandelt werden) (Wojtek 6.11 neu aufgenommen) - aktuell kann einer übergeben werden (aus Python Skript)
    2. Callback-URL & Prozessstandard bei Einreichung einer Submission im SDK mitgeben (Erweiterung bestehender Funktionalität, POST /v1/submissions)
    3. Submission mit den Punkten aus 1.2 versenden (POST /v1/submissions, PUT /v1/submissions/{submissionId}/attachments/{attachmentId}, PUT /v1/submissions/{submissionId})
    4. Auflisten abholbereiter Replies (GET /v1/replies)
    5. Reply inkl. Anlagen abrufen (GET /v1/replies/{replyId} & GET /v1/replies/{replyId}/attachments/{attachmentId}) und automatisch rejecten, wenn technische Fehler vorliegen (/v1/replies/{replyId}/reject) (siehe auch SOLL-Zustand in https://git.fitko.de/fit-connect/planning/-/issues/654#anforderungen-zur-verschl%C3%BCsselung)
    6. Reply akzeptieren (PUT /v1/replies/{replyId}/accept) oder ablehnen (PUT /v1/replies/{replyId}/reject)
    7. Auf die Reply zu dem Case eine neue Submission verschicken (wie 1.3, aber jetzt mit Case-ID) (POST /v1/submissions, PUT /v1/submissions/{submissionId}/attachments/{attachmentId}, PUT /v1/submissions/{submissionId})
  2. Anwendungsfälle in der Rolle des Fachverfahrens (Antwort senden)
    1. Submission abholen inkl. Encryption Key & Prozeessstandard aus den Metadaten (GET /v1/submissions, GET /v1/submissions/{submissionId}, GET /v1/submissions/{submissionId}/attachments/{attachmentId})
      • JAVA: sortieren aller Submissions auf Basis der "issuedAT" Parameters möglich machen und als Parameter in "ReceivedSubmissions" aufnehmen (Zurückgeben des Encryption Keys und Timestamp wann die Submission auf "submitted" gesetzt worden ist und Hinweis in der Doku, dass der aktuellste Encryption Key an dem Case gespeichert werden muss)
      • JAVA: Prüfen ob in den Submission-Metadaten als auch in der Destination hinterlegt der gewünschte Prozessstandard angegeben und unterstützt wird.
      • .NET: submittedAT Parameter aus den Events rauslesen und an receivedSubmission hängen (Wojtek 6.11 neu aufgenommen)
    2. Submission ablehnen / akzeptieren (POST /v1/cases/{caseId}/events)
    3. Mit dem Encryption Key eine Reply zu dem Case erstellen (POST /v1/replies), Anlage hinzufügen (PUT /v1/replies/{replyId}/attachments/{attachmentId}) und Antwort versenden (PUT /v1/replies/{replyId})
      • Encryption Key muss vom FV als Parameter übergeben werden hier ist die letzte Submission des Cases für die generierung der Reply zu übergeben (Anm. Wojtek 1.11)
    4. Submission abholen inkl. Encryption Key & Prozessstandard aus den Metadaten - mit Case-Bezug (GET /v1/submissions, GET /v1/submissions/{submissionId}, GET /v1/submissions/{submissionId}/attachments/{attachmentId})
    5. [ ] Closetime zurücksetzen [DISCUSS]: über welchen Endpunkt - nicht relevant (Löschfristen über Submissions / Replies) - Umsetzung erst wenn auch Case detaillierter im Zustelldienst ausgearbeitet wird
    6. [ ] Vorgang schließen aktuell nicht implementiert (Antwort kann immer kommen) - Umsetzung erst wenn auch Case detaillierter im Zustelldienst ausgearbeitet wird
  3. übergreifende Anwendungsfälle (Vorgangsverwaltung):
    1. Aktive Cases auflisten als Sender (GET /v1/cases),
      • JAVA: Quercheck ob wir wirklich unterschiedliche Antworten bekommen (Anm. Wojtek 1.11)
      • .NET: Quercheck ob wir wirklich unterschiedliche Antworten bekommen & Testcase fehlt (Anm. Wojtek 6.11)
    2. Aktive Cases auflisten als Subscriber (GET /v1/cases),
      • .NET: Testcase fehlt (Anm. Wojtek 6.11)
    3. Event Log prüfen (GET /v1/cases/{caseId}/events) - letztes Event bleibt wie bislang abrufbar - Es muss in einem neuen Issue geprüft werden, warum einzelne Status validiert werden können, aber eine Liste an Status nicht.
    4. [ ] Vorgangssinformationen abrufen (GET /v1/cases/{caseId}) - Umsetzung erst wenn auch Case detaillierter im Zustelldienst ausgearbeitet wird
  • Methodensignaturen sind über alle Programmiersprachen (angemessen) gleich
  • Alle Funktionalitäten des SDKs sind in der Dokumentation integriert mit entsprechenden Code-Beispielen
  • Video zur Nutzung des SDKs wurde bereitgestellt
  • Kommunikationsmaßnahmen begleitend zur Veröffentlichung der Test- und Produktiv-nutzbaren Version wurden angestoßen

Stories zu dem Epic

  1. JAVA SDK Anpassungen gemäß obiger Anwendungsfälle:
    1. Änderung beim Versand und Empfang des Antrags
      • Versand: v.a. Angabe Callback, Prozessstandards & Generierung Encryption Key, Bezug zum Case (AK: 1.1, 1.2, 1.3, 1.7)
      • Empfang: v.a. Encryption Key aus der (lettzen) Submission holen (AK: 2.1, 2.2, 2.4)
    2. Reply senden & empfangen
      • Versand (AK: 2.3)
      • Empfang (AK: 1.4, 1.5, 1.6)
    3. Vorgangsverwaltung (AK 3.1, 3.2, 3.3)
  2. .NET SDK Anpassungen gemäß obiger Anwendungsfälle:
    1. Änderung beim Versand und Empfang des Antrags
      • Versand: v.a. Angabe Callback, Prozessstandards & Generierung Encryption Key, Bezug zum Case (AK: 1.1, 1.2, 1.3, 1.7)
      • Empfang: v.a. Encryption Key aus der (lettzen) Submission holen (AK: 2.1, 2.2, 2.4)
    2. Reply senden & empfangen
      • Versand (AK: 2.3)
      • Empfang (AK: 1.4, 1.5, 1.6)
    3. Vorgangsverwaltung (AK 3.1, 3.2, 3.3)
  3. Methodensignaturen abgleichen (im Nachgang aufwandsärmer)
  4. Dokumentation des SDKs
  5. Videos zu den SDKs erstellen
  6. Veröffentlichung des SDKs

offene Fragen:

  1. AK1.1 @Marco_Holz können wir für die Generierung der Zertifikate Schlüsselpaare auf der Generierung der Testzertifikate aufsetzen?
    • Anmerkung @Marco_Holz: Grundsätzlich ja. Hilfreich wäre sicherlich, wenn wir uns für das kid-Atrribut eine Struktur überlegen, anhand der erkennbar ist, dass es sich um einen von einem Onlinedienst erstellen Key handelt. Initialer Vorschlag: "kid": "reply-key:{caseId}"?
  2. AK1.1 @Marco_Holz Welche Gültigkeitsdauer des Zertifikats wäre angemessen? 10 Jahre ok?
    • Für den Rückkanal kommen keine X509-Zertifakte aus der V-PKI zum Einsatz, sondern ad-hoc generierte Schlüsselpaare (sog. ephemeral keys). Dazu brauchen wir also keine Zertifikate im x5c-Feld, aus denen die Schlüssel abgeleitet sind, sondern können direkt JSON Web Keys generieren. JWKs enthalten keinen Gültigkeitszeitraum.
  3. AK1.2, AK1.5, AK2.3 @Marco_Holz Feld Prozessstandard - ist es auch ein Fachdatenschema / bzw. äquivalentes und muss dann das Payload ähnlich wie bei der Submission validiert werden?
  4. AK3.3 @Marco_Holz sind in GET /v1/cases/{caseId}/events sowohl die Events der Submissions als auch der Replies enthalten? Aktuell geben die SDKs nur den letzten Status zurück. Sofern mehrere Submissions & Replies enthalten sind wird das etwas kompliziert, daher wäre der Vorschlag alle auszugeben und entsprechende Filtermögichkeiten einzurichten.
    • Wir brauchen je eine Methode, um den Zustand einer Submission und den Zustand eines Replys ermitteln zu können. Im SDKs könnten wir das zunächst so umsetzen, dass die Events vor der Ermittlung des Zustands nach submissionI oder replyId gefiltert werden. Zukünftig wäre auch eine Filterung direkt am API-Endpunkt denkbar, z.B. so: GET /v1/cases/{caseId}/events?submissionId=dd5a7c58-9867-49b2-ac60-6b60b749bd57
  5. Sollen für die Replies dieselben/ähnliche Prüfungen wie für die Submissions nach Docs stattfinden?

Anforderungen zur Verschlüsselung

Ist-Zustand (für Einreichungen)

Sender verschlüsselt eine Submission (bzw. deren Bestandteile) mit dem Public Key des Subscribers. Zertifikat aus Verwaltungs-PKI liegt pro Subscriber vor.

Sender können auch von externen Benutzern betrieben werden. Diese haben keine Zertifikate aus der Verwaltungs-PKI.

Sender übergibt beim Einreichen einen (optionalen) Public-Key mit, mit dem die Antworten verschlüsselt werden können:

  • Bei Antwort über Email per optionalem PGP-Key
  • Bei Antwort über FIT-Connect ein JSON Web Key (diesem liegt kein Zertifikat zugrunde)

Soll-Zustand

Für bidirektionale Kommunikation muss der Public-Key (im Meta-Datensatz durch den Sender) zwingend vorgegeben werden. Das kann nur im SDK bei der Einreichung geprüft und ggf. zurückgewiesen werden.

Edited by Wojciech Gdaniec