> For the complete documentation index, see [llms.txt](https://docs.opencityitalia.it/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.opencityitalia.it/sviluppatori-e-partner-tecnologici/integrazioni/single-sign-on/sso-mediante-jwt.md).

# 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](/installazione-e-manutenzione/integrazioni/autenticazioni.md), 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="/files/HhrZzKiJLn7atJlYUZ9f" 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="/files/wcrXmcRK1xzhIyA4nk3u" 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="/files/0Fy18MiT3iWdrDkAcqF8" 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="/files/RnCJDMUtGcoRgOrA8EmA" 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"
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.opencityitalia.it/sviluppatori-e-partner-tecnologici/integrazioni/single-sign-on/sso-mediante-jwt.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
