# Esempio con GovWay

API privata, che si intende esporre mediante GovWay:

```
https://192.168.1.111:8000/conti-correnti
```

L'API risponde un dato privato se viene correttamente inserito un parametro in get tax\_code che identifica il codice fiscale del cittadino che esegue la richiesta:

```
https://192.168.1.111:8000/items/conti-correnti?tax_code=AAABBBXX...
```

L'API non ha un controllo interno che permette di rispondere ad ogni cittadino solo con i suoi dati, l'API è aperta e risponde a qualunque chiamata.

In questo esempio si desidera esporre l'API privata su un indirizzo pubblico e filtrare le chiamate in modo che ogni cittadino possa consultare l'API solo per i propri dati.&#x20;

L'API esposta è la seguente:

```
https://govway-qa-out.boat.opencontent.io/govway/Ente/directus/v1
```

Quando viene chiamata quest'ultima url si desidera imporre un controllo sulla la presenza del token JWT e sul parametro della chiamta. La chiamata deve raggiungere l'API privata SOLO se:

1. il token è presente
2. il token è validato mediante la chiave pubblica esposta in [JWKS](https://servizi.comune-qa.bugliano.pi.it/.well-known/jwks.json)
3. viene passato il parametro `tax_code` in GET
4. il parametro tax\_code corrisponde al valore `username` del token

Quest'ultimo punto è il più importante perché ci da la certezza che il cittadino che sta facendo la richiesta è lo stesso che si è autenticato.

### Configurazione

<figure><img src="https://2402436129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNwAiDeLoMPCkkp1BdSbI%2Fuploads%2FXtCJtfDgOXBHxrpGy4YI%2Fimage.png?alt=media&#x26;token=79e86ce2-2f0d-47b8-ace2-8b9959ab6d29" alt=""><figcaption><p>Selezionare il profilo API Gateway</p></figcaption></figure>

<figure><img src="https://2402436129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNwAiDeLoMPCkkp1BdSbI%2Fuploads%2FyfXYwKSWZHLlIb12rtph%2Fimage.png?alt=media&#x26;token=43714365-c75e-42cc-9780-1d672e4f4378" alt=""><figcaption><p>Aggiungere la definizione dell'API: per farlo sarà necessario caricare il file Open API 3 della definizione dell'API stessa.</p></figcaption></figure>

<figure><img src="https://2402436129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNwAiDeLoMPCkkp1BdSbI%2Fuploads%2FJMDnAQCt2NPsd2Cw4evQ%2Fimage.png?alt=media&#x26;token=2ae25c77-ab46-4971-b1bb-de8f153fee9e" alt=""><figcaption><p>Configurazione del connettore</p></figcaption></figure>

<figure><img src="https://2402436129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNwAiDeLoMPCkkp1BdSbI%2Fuploads%2Fik61xMwztSeD3v9bqz4m%2Fimage.png?alt=media&#x26;token=a1f99f75-a530-4ca2-95e2-2796783b3055" alt=""><figcaption><p>Creare una API in Erogazione che esponga l'API che si desidera proteggere: si usa la definizione dell'API configurata allo step precedente e si impostano la URL di invocazione e la url del servizio interno che espone l'API (connettore) </p></figcaption></figure>

E' necessario creare una token policy, che poi verrà assegnata all'erogazione delle API

<figure><img src="https://2402436129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNwAiDeLoMPCkkp1BdSbI%2Fuploads%2FoaTbTYqBDoBUbdS9UPiW%2Fimage.png?alt=media&#x26;token=5ac70680-c38b-4af5-adb7-e4012da998ce" alt=""><figcaption><p>Creazione token policy: fare attenzione a tutti i campi evidenziati. Lo username verrà usato per fare il controllo di accesso.</p></figcaption></figure>

Il file jwks è stato scaricato da <https://servizi.comune-qa.bugliano.pi.it/.well-known/jwks.json> e inserito in un path raggiungibile da GovWay: nel nostro caso essendo GovWay installato con Docker abbiamo fatto uso della direttiva `volumes` per condividere il file con il container di GovWay.

Fare attenzione inoltre che il `kid` della chiave pubblica è specifico per ogni tenant e deve essere quello corretto.

Predisposta la policy deve essere applicata all'Erogazione API

<figure><img src="https://2402436129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNwAiDeLoMPCkkp1BdSbI%2Fuploads%2FLswHlgrHj0M8HT4MQyds%2Fimage.png?alt=media&#x26;token=72f772d1-cb6d-4ba8-8261-cc1ddca3e0da" alt=""><figcaption><p>Configurazione dell'Erogazione creata in precedenza</p></figcaption></figure>

<figure><img src="https://2402436129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNwAiDeLoMPCkkp1BdSbI%2Fuploads%2FQjrCAREozo2TzhN7eOkZ%2Fimage.png?alt=media&#x26;token=c936f8ca-9b21-47b7-b085-1638ca944a27" alt=""><figcaption><p>Si accede alle configurazioni necessarie dalla sezione "Controllo Accessi" dell'Erogazione API</p></figcaption></figure>

<figure><img src="https://2402436129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNwAiDeLoMPCkkp1BdSbI%2Fuploads%2FzrUDZdApxzfL9G9qUtSM%2Fimage.png?alt=media&#x26;token=f65a9501-4dbe-4260-b40e-067950aeee9c" alt=""><figcaption><p>Il controllo prevede la Policy predisposta agli step precedenti, la validazione del token e la presenza del claim username. Infine viene inserito il controllo sul contenuto come indicato nell'immagine.</p></figcaption></figure>

Il controllo del contenuto viene fatto imponendo che l'informazione riportata nel token (`${tokenInfo:username}`) e quella inserita come parametro GET della chiamata (`${query:filter[tax_code]}`) abbiano lo stesso valore. Resta inteso che il valore nel token è vincolato dalla piattaforma, mentre il parametro `tax_code` è scelto da chi ha progettato l'API che viene protetta.

A questo punto la configurazione è completa.
