# SSO mediante oAuth2

{% hint style="warning" %}
La funzionalità è disponibile esclusivamente su richiesta.
{% endhint %}

Una autenticazione con SSO tra Opencity Italia e un applicativo in uso allo stesso Ente può essere agevolmente realizzata se può essere garantito il supporto per il protocollo [oAuth2](https://oauth.net/2/).&#x20;

Vediamo uno schema generale degli attori in gioco:

{% @mermaid/diagram content="C4Context
title OAuth2 Integration
Boundary(b0, "Opencity Italia SaaS"){
System(openlogin, "Open Login")
System(core, "Area personale")
}

Person\_Ext(cittadino, "Cittadino", "Si autentica con SPID o CIE")
System\_Ext(app3p, "App di terze parti")

Rel(cittadino, openlogin, "SPID/CIE")
Rel(app3p, openlogin, "client oAuth2")
Rel(core, openlogin, "client oAuth2")

UpdateLayoutConfig($c4ShapeInRow="2", $c4BoundaryInRow="1")
" %}

Vediamo un flusso di autenticazione di un cittadino che fa login prima sull'area personale e successivamente sull'applicativo di terze parti:

{% @mermaid/diagram content="sequenceDiagram
autonumber
actor c as Cittadino
participant core as Area Personale
participant ol as Openlogin
participant idp as Identity Provider
participant app3p as Altra App
c -->> core: accesso a /login
core --> c: il tenant richiede /login-auth
c -->> core: /login-auth
Note over core: Il client di Area Personale<br> verifica presenza sessione/avvia<br>flusso oauth2 (definita redirect\_url)
core -->> c: redirect to url\_authorize di openlogin
c -->> ol: login page
Note over core, ol: Scelta tra Spid/CIE
rect rgb(192, 223, 255)
ol -->> c: redirect to SPID Provider o CIE
c -->> idp: flusso di autenticazione SPID o CIE
idp -->> c: POST Saml a openlogin / Flusso OpenID CIE
c -->> ol: il cittadino torna su openlogin
Note over c, ol: Viene creato l'utente<br> e agganciata la sessione SPID alla sessione OpenLogin.<br>Riparte flusso oAuth
end
ol -->> c: openlogin ti rimanda a A.P. a /login-auth con codice autorizzazione
core -->> ol: con il codice di autorizzazione chiama url\_access\_token di OpenLogin
ol -->> core: restituisce il token oAuth2
core -->> ol: richiede il profilo utente all'indirizzo url\_resource\_owner\_details e<br> li salva nella propria sessione
" %}

L'applicativo di terze parti dovrà essere dotato di un opportuno client oAuth2. Ipotiziamo che le url coinvolte siano le seguenti e mostriamo una tipica configurazione del client.

{% hint style="info" %}
URL dell'area personale: <https://servizi.comune.bugliano.pi.it>

URL della pagina di login (OpenLogin): <http://login.comune.bugliano.pi.it>

URL dell'applicativo di terze parti: <http://myapp.company.com>
{% endhint %}

Per attivare un nuovo client è necessario fornire:

* La URL da autorizzare come redirct uri del client
* La URL di logout

L'attivazione comprende i seguenti dati

```
redirect_url: http://servizi.comune.bugliano.pi.it/lang/auth/login-oauth
url_authorize: http://login.comune.bugliano.pi.it/authorize
url_access_token: http://login.comune.bugliano.pi.it/token
url_resource_owner_details: http://login.comune.bugliano.pi.it/api/profile
url_logout: http://login.comune.bugliano.pi.it/logout?redirect=http://servizi.comune.bugliano.pi.it/lang
client_id: {client_id} fornito da Opencity Labs
client_secret: {client_secret} fornito da Opencity Labs
```
