Skip to content
Snippets Groups Projects
Verified Commit 0074c5f8 authored by Jonas Gröger's avatar Jonas Gröger :palm_tree:
Browse files

fix: make tabs work

parent cfb4da1d
No related branches found
No related tags found
1 merge request!55fix: make tabs work
......@@ -2,11 +2,13 @@
title: Verwendung von Callbacks
---
import ApiLink from '@site/src/components/ApiLink'
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import ApiLink from '@site/src/components/ApiLink';
Der FIT-Connect Zustelldienst informiert sendende und empfangende Systeme (API-Clients) aktiv über [neue Einreichungen](../getting-started/receiving/query.mdx) oder [Statusupdates](../getting-started/sending/query-status.mdx).
Hierzu werden HTTP-Callbacks genutzt, die auch als [Webhooks](https://de.wikipedia.org/wiki/WebHooks) bezeichnet werden.
Webhooks ermöglichen es, API-Clients aktiv über diese Ereignisse zu informieren ohne dass eine regelmäßige Abfrage ([Polling](https://de.wikipedia.org/wiki/Polling_(Informatik))) nötig wäre.
Webhooks ermöglichen es, API-Clients aktiv über diese Ereignisse zu informieren, ohne dass eine regelmäßige Abfrage ([Polling](https://de.wikipedia.org/wiki/Polling_(Informatik))) nötig wäre.
Technisch werden Webhooks als HTTP-POST-Request realisiert.
Im Folgenden verwenden wir die Begriffe *Callback* und *Webhook* synonym.
......@@ -41,13 +43,13 @@ Die Einrichtung von Callbacks im Self-Service-Portal wird im Artikel `TODO: Link
### Konfiguration von Callbacks für Zustellpunkte
Über die API können Callbacks für Zustellpunkte wie folgt konfiguriert werden:
<Tabs
defaultValue="curl"
values={[
{label: 'curl', value: 'curl',},
{label: 'Java', value: 'java',},
{label: 'JavaScript', value: 'javascript',},
]}>
<TabItem value="curl" label="curl">
defaultValue="curl"
values={[
{label: 'curl', value: 'curl',},
{label: 'Java', value: 'java',},
{label: 'JavaScript', value: 'javascript',},
]}>
<TabItem value="curl">
```bash
$ SERVICE_URL=...
......@@ -61,27 +63,30 @@ $ curl -X PATCH \
--data "{ \"callback\": { \"url\": \"$CALLBACK_URL\", \"secret\": \"$CALLBACK_SECRET\" }}" \
"$SERVICE_URL/v1/destinations/$DESTINATION_ID"
```
</TabItem>
<TabItem value="java">
</TabItem>
<TabItem value="java" label="Java">
:::caution TODO
TODO: Codebeispiel ergänzen
:::
</TabItem>
<TabItem value="JavaScript" label="JavaScript">
</TabItem>
<TabItem value="javascript">
:::caution TODO
TODO: Codebeispiel ergänzen
:::
</TabItem>
</TabItem>
</Tabs>
## Prüfung von Callbacks
API-Clients, die Callbacks empfangen, **MÜSSEN** zwingend sicherstellen, dass ausgelöste Callbacks von einem vertrauenswürdigen Zustelldienst stammen.
Hierzu enthalten Callbacks einen Message Authentication Code (HMAC) gemäß [RFC 2104](https://datatracker.ietf.org/doc/html/rfc2104) auf Basis des angegebenen *Callback-Secrets*.
Ein Message Athentication Code kann als „symmetrische Signatur“ verstanden werden und ermöglicht die Prüfung der Herkunft und Integrität eines eingehende Callbacks.
Ein HMAC kann als „symmetrische Signatur“ verstanden werden und ermöglicht die Prüfung der Herkunft und Integrität eines eingehenden Callbacks.
Der Message Authentication Code wird im HTTP-Header `callback-authentication` übertragen.
Um [Replay-Angriffe](https://de.wikipedia.org/wiki/Replay-Angriff) zu vermeiden, enthält der Message Authentication Code einen aktuellen Timestamp.
Der HMAC wird im HTTP-Header `callback-authentication` übertragen.
Um [Replay-Angriffe](https://de.wikipedia.org/wiki/Replay-Angriff) zu vermeiden, enthält er einen aktuellen Timestamp.
Dieser Timestamp wird im HTTP-Header `callback-timestamp` übertragen.
Bei der Prüfung der Echtheit des ausgelösten Callbacks **MÜSSEN** API-Clients prüfen, dass der angegebene Timestamp nicht älter als **5 Minuten** ist.
......@@ -100,7 +105,7 @@ Als Hash-Algorithmus wird SHA-512 verwendet.
callback-authentication = BASE64(HMAC(key={callback-secret}, message={timestamp}.{http-body}))
```
Um den Message Authentication Code (HMAC) zu verifizieren, bildet der API-Client mit Hilfe des *Callback Secret* den HMAC nach und vergleicht diesen mit dem im HTTP-Header `callback-authentication` übertragenen HMAC.
Um den HMAC zu verifizieren, bildet der API-Client mithilfe des *Callback Secret* den HMAC nach und vergleicht diesen mit dem im HTTP-Header `callback-authentication` übertragenen HMAC.
Bei der Prüfung **MÜSSEN** die folgenden Implementierungshinweise zwingend zu beachten:
- Das Callback Secret **MUSS** in API-Clients konfigurierbar sein und **DARF NICHT** fest im Quellcode eines API-Clients einprogrammiert sein.
......@@ -110,9 +115,12 @@ Bei der Prüfung **MÜSSEN** die folgenden Implementierungshinweise zwingend zu
- Beim Vergleich des übertragenen HMAC und des vom API-Client gebildeteten HMAC **MUSS** ein zeitlich konstanter Zeichenfolgenvergleich (*constant time string comparison*) verwendet werden.
- In Python kann dies über die Verwendung der Methode [`hmac.compare_digest`](https://docs.python.org/2/library/hmac.html#hmac.compare_digest) erreicht werden.
- In Ruby kann dies über die Verwendung der Methode [`secure_compare`](https://rubydoc.info/github/rack/rack/master/Rack/Utils:secure_compare) erreicht werden.
- Callbacks mit ungültigem Message Authentication Code **MÜSSEN** von API-Clients ignoriert/verworfen werden.
- Callbacks mit ungültigem HMAC **MÜSSEN** von API-Clients ignoriert werden.
Dabei ist zunächst der Zeitstempel (`callback-timestamp`-Header) und anschließend der HMAC (`callback-authentication`-Header) zu prüfen:
Dabei ist zunächst
* der Zeitstempel (`callback-timestamp`-Header) und anschließend
* der HMAC (`callback-authentication`-Header)
zu prüfen:
```python
# 1. Timestamp überprüfen
......@@ -140,4 +148,4 @@ else:
print('hmac ok')
```
Das dargestellte Script findet sich auch zur freien Verwendung im [FIT-Connect-Tools-Repository](https://git.fitko.de/fit-connect/fit-connect-tools/-/blob/main/validate-callback.py).
Das vollständige Script findet sich auch zur freien Verwendung im [FIT-Connect-Tools-Repository](https://git.fitko.de/fit-connect/fit-connect-tools/-/blob/main/validate-callback.py).
......@@ -30,7 +30,7 @@ Die Details sind der API-Spec zu entnehmen.
{label: 'curl', value: 'curl',},
{label: 'Self-Service-Portal', value: 'ssp',},
]}>
<TabItem value="curl" label="foo">
<TabItem value="curl">
#### Aktualisierung des Verschlüsselungsschlüssels eines Zustellpunktes
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment