# SSO mediante JWT

Questo consente di usare l'autenticazione senza necessariamente usare lo stesso cookie:

1. integrarsi con altri applicativi di terze parti che possono usare un client JWT;
2. fare chiamate cross-origin (CORS) autenticate dove non è semplice o possibile sfruttare lo stesso cookie di autenticazione;

{% hint style="info" %}
Attenzione: il requisito perché questa tecnica funzioni è che i servizi si trovino tutti sotto lo stesso dominio di secondo livello. Ad esempio:\
\- servizi.comune.bugliano.pi.it\
\- [www.comune.bugliano.pi.it\\](http://www.comune.bugliano.pi.it\\)
\- altro.bugliano.pi.it
{% endhint %}

### Il Cookie di Sessione

Come molti applicativi web anche Opencity Italia usa i cookie per implementare la sessione utente, il cookie si ottiene semplicemente l'indirizzo di accesso degli utenti: ad esempio per il nostro Ente di demo è

{% embed url="<https://servizi.comune.bugliano.pi.it/lang/it/user>" %}
Il path per fare accesso è sempre /$lingua/user
{% endembed %}

In base alla [configurazione del tipo di accesso](https://app.gitbook.com/s/3Lijwdi7sVujjCdIagU2/integrazioni/autenticazioni), si viene rediretti su un provider di autenticazione (tipicamente un sistema che permette il login con Spid/CIE), si eseguono tutti gli step necessari e infine si torna sull'area personale con una sessione valida.

A questo punto nel proprio brower è possibile rintracciare facilmente il cookie della piattaforma.<br>

<figure><img src="https://2402436129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNwAiDeLoMPCkkp1BdSbI%2Fuploads%2F91SbC2q1ZLs1BGn6Jg3w%2Fimage.png?alt=media&#x26;token=af5f8cec-d32d-46b9-9aa9-b1c1a3af2b6a" alt=""><figcaption><p>Esempio di cookie di sessione</p></figcaption></figure>

### Il token JWT

Il cookie di sessione viene inviato in modo trasparente all'utente dal browser al sito che lo ha generato, e questo garantisce che l'utente abbia sempre una sessione valida quando naviga nella sua area personale.

Per fare chiamate alle API però è necessario convertire il Cookie in Token JWT, per farlo esiste una apposita API, nel nostro esempio:

{% embed url="<https://servizi.comune.bugliano.pi.it/lang/api/session-auth>" %}
l'API per ottenere il token JWT è /api/session-auth
{% endembed %}

Per simulare la chiamata con Postman ad esempio:

<figure><img src="https://2402436129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNwAiDeLoMPCkkp1BdSbI%2Fuploads%2F1ejrv0YBjyW5ao926bYg%2Fimage.png?alt=media&#x26;token=3f3eebd3-fc88-4710-8ab7-b1f1c80e4e38" alt=""><figcaption><p>esemio di chiamata per recupeare il token JWT usando il cookie e l'API /session-auth</p></figcaption></figure>

Il token JWT può essere usato adesso per fare chiamate alle API che richiedono una autenticazione, ad esempio posso usare l'interfaccia Swagger delle API come segue.

Faccio click in alto a destra sul comando Authorize

<figure><img src="https://2402436129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNwAiDeLoMPCkkp1BdSbI%2Fuploads%2FqwXxI6lnLUgtTb9r1gk6%2Fimage.png?alt=media&#x26;token=fbdc245e-1921-4602-8f9a-0fbff9bee0e7" alt=""><figcaption><p><a href="https://servizi.comune.bugliano.pi.it/lang/api/doc">https://servizi.comune.bugliano.pi.it/lang/api/doc</a></p></figcaption></figure>

<figure><img src="https://2402436129-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FNwAiDeLoMPCkkp1BdSbI%2Fuploads%2FjP5yJDf1t7XJ3GSrPdFN%2Fimage.png?alt=media&#x26;token=cf06e59d-2158-4f04-9769-f5d543f1c955" alt=""><figcaption><p>Inserisco il valore del token ottenuto con la chiamata /session-auth</p></figcaption></figure>

A questo punto posso chiamare le API che richiedono autenticazione come la `/applications`

### Anatomia di un Token

All'interno del token sono presenti le seguenti informazioni:

#### Header

```json
{
  "typ": "JWT",
  "alg": "RS256"
}
```

#### Payload

```json
{
  "iat": 1711639327,
  "exp": 1712503327,
  "roles": [
    "ROLE_CPS_USER",
    "ROLE_USER"
  ],
  "username": "AAAAAANNANNAMNNNA",
  "id": "ba23337b-7b9e-4e5a-9566-e3f0583822f7",
  "tenant_id": "5962qqfb-15b7-4407-b203-47ee3456f6c3"
}
```
