PHPackages                             efumanti/cohesion2-library - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. efumanti/cohesion2-library

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

efumanti/cohesion2-library
==========================

Libreria PHP per l'autenticazione al sistema di SSO Cohesion2 della Regione Marche. Fork modernizzato per PHP 8.3+.

v4.0.2(4w ago)02MITPHPPHP ^8.3CI passing

Since Jun 16Pushed 4w agoCompare

[ Source](https://github.com/efumanti/Cohesion2PHP83Library)[ Packagist](https://packagist.org/packages/efumanti/cohesion2-library)[ Docs](https://github.com/efumanti/Cohesion2PHP83Library)[ RSS](/packages/efumanti-cohesion2-library/feed)WikiDiscussions master Synced 1w ago

READMEChangelog (1)Dependencies (3)Versions (11)Used By (0)

Cohesion2 libreria PHP
======================

[](#cohesion2-libreria-php)

> **Fork modernizzato per PHP 8.3+** del progetto originale [`andreaval/Cohesion2PHPLibrary`](https://github.com/andreaval/Cohesion2PHPLibrary)di Andrea Vallorani. Mantiene la stessa API pubblica della 3.x, alza il requisito minimo a PHP 8.3, riscrive le chiamate HTTPS con cURL (TLS verificato), corregge una serie di problemi di sicurezza (open redirect, XML injection, session fixation, XXE, …) e introduce una suite PHPUnit con analisi statica PHPStan a livello max. Vedi la sezione "Storia del progetto" in fondo per il dettaglio.

Libreria per l'autenticazione al sistema di SSO Cohesion2 della Regione Marche. Questa libreria permette di integrare il Single Sign-On di Cohesion2 in siti o applicativi web sviluppati in linguaggio PHP.

Requisiti di installazione
--------------------------

[](#requisiti-di-installazione)

- PHP 8.3 o superiore
- Estensione PHP `curl` abilitata (richiesta per le chiamate HTTPS verso Cohesion2)
- Estensioni PHP `dom`, `libxml`, `simplexml` (di norma incluse nel pacchetto standard)

Installazione
-------------

[](#installazione)

Tramite [Composer](https://getcomposer.org/):

```
composer require efumanti/cohesion2-library
```

oppure **manualmente** copiando la directory `cohesion2/` in un qualsiasi punto della cartella web dell'applicativo. Assicurarsi che la cartella contenga i file:

- `Cohesion2.php`
- `Cohesion2Exception.php`

Abilitazione SSO
----------------

[](#abilitazione-sso)

Il Single Sign-On è abilitato per default nella libreria. Questo significa che prima di reindirizzare l’utente alla maschera di login, il sistema verifica la validità della sessione ed evita quindi all’utente di doversi riautenticare. Per disabilitare, eventualmente il SSO, e forzare quindi sempre all’autenticazione, utilizzare il seguente comando:

```
      $cohesion = new Cohesion2;
      $cohesion->useSSO(false);
      $cohesion->auth();
```

### Esempio di utilizzo

[](#esempio-di-utilizzo)

```
      require_once 'cohesion2/Cohesion2.php';
      use andreaval\Cohesion2\Cohesion2;
      use andreaval\Cohesion2\Cohesion2Exception;
      try{
          $cohesion = new Cohesion2;
          $cohesion->auth();
      }
      catch(Cohesion2Exception $e){
          die($e->getMessage());
      }
      if($cohesion->isAuth()){
          echo 'Utente autenticato: '.$cohesion->username.'';
          echo 'Id SSO: '.$cohesion->id_sso.'';
          echo 'Id Aspnet: '.$cohesion->id_aspnet.'';
          echo 'Profilo: '.var_export($cohesion->profile,1).'';
      }
```

Identificativo applicativo (`id_sito`)
--------------------------------------

[](#identificativo-applicativo-id_sito)

Cohesion2 identifica l'applicazione client tramite il campo ``incluso nel payload di richiesta. Fino alla 3.x questo valore era hardcoded a `'TEST'`. Dalla 4.0.0 si imposta tramite il quarto parametro del costruttore o via variabile d'ambiente `COHESION2_SITE_ID`.

```
$cohesion = new Cohesion2('cohesion2', null, null, 'PORTALE_AZIENDA');
```

oppure:

```
COHESION2_SITE_ID=PORTALE_AZIENDA

```

Il default rimane `'TEST'` per compatibilità con installazioni esistenti, ma è da sostituire prima del passaggio in produzione concordando il valore con il referente Cohesion2 della Regione Marche.

Configurazione di sicurezza: whitelist degli host di callback
-------------------------------------------------------------

[](#configurazione-di-sicurezza-whitelist-degli-host-di-callback)

L'URL di callback inviata a Cohesion2 al termine dell'autenticazione viene costruita a partire dall'host della richiesta corrente. L'header HTTP `Host`è però controllato dal client e, in assenza di una validazione, può essere manipolato per indurre Cohesion2 a redirigere l'utente verso un host arbitrario subito dopo il login (open redirect / token leakage, CWE-601).

A partire dalla 4.0.0 la libreria accetta una whitelist di host autorizzati. Quando la whitelist è popolata, l'header `Host` deve corrispondere (case-insensitive) a uno dei valori dichiarati: in caso contrario `auth()`solleva `Cohesion2Exception`. Quando la whitelist è vuota, la libreria usa `$_SERVER['SERVER_NAME']` (configurato lato web server) anziché `HTTP_HOST`.

**Impostazione via costruttore:**

```
$cohesion = new Cohesion2('cohesion2', ['app.example.it', 'www.example.it']);
$cohesion->auth();
```

**Impostazione via variabile d'ambiente** (utile con `.env`):

```
COHESION2_ALLOWED_HOSTS=app.example.it,www.example.it

```

```
// La libreria legge automaticamente $_ENV / $_SERVER / getenv() in questo
// ordine. È compatibile con vlucas/phpdotenv, Symfony Dotenv e Laravel.
$cohesion = new Cohesion2();
$cohesion->auth();
```

In ambiente di produzione si consiglia di **dichiarare sempre** la whitelist.

### Applicazioni dietro un reverse proxy / load balancer

[](#applicazioni-dietro-un-reverse-proxy--load-balancer)

Quando il TLS è terminato a monte (load balancer, CDN, ingress controller), `$_SERVER['SERVER_PORT']` vale 80 e la libreria, in assenza di altri segnali, costruirebbe una callback URL `http://…` esponendo il token nel redirect.

Il terzo parametro del costruttore — `trustProxy` — abilita la lettura di `X-Forwarded-Proto` per determinare lo schema. **Va attivato solo se l'app è raggiungibile esclusivamente tramite il proxy**: l'header è altrimenti spoofabile.

```
$cohesion = new Cohesion2('cohesion2', null, true);
```

oppure via variabile d'ambiente:

```
COHESION2_TRUST_PROXY=1

```

Abilitazione SAML 2.0
---------------------

[](#abilitazione-saml-20)

E' possibile indicare a Cohesion di utilizzare lo standard SAML 2.0 tramite l'apposito metodo **useSAML20()** . L'utilizzo di tale metodo permette agli utenti di autenticarsi anche tramite sistema SPID.

```
      $cohesion = new Cohesion2;
      $cohesion->useSAML20(true);
      $cohesion->enableEIDASLogin(); //per abilitare il login eIDAS
      $cohesion->enableSPIDProLogin(['PF','PG','LP']); //per abilitare il login SPID Professionale
      $cohesion->auth();
```

Spiegazione del meccanismo di autenticazione
--------------------------------------------

[](#spiegazione-del-meccanismo-di-autenticazione)

Invocando il metodo auth() della classe Cohesion2 viene avviato il processo di autenticazione tramite SSO. Il processo si svolge in 4 passi:

1. Viene invocata la pagina web  per verificare se l’utente risulti già autenticato tramite SSO
2. Nel caso l’utente non sia autenticato, il browser dell’utente viene automaticamente reindirizzato alla pagina di login
3. Se l’autenticazione ha esito positivo, la libreria istanzia una variabile di sessione per tenere traccia dell’avvenuta autenticazione ed invoca la pagina web  per recuperare il profilo dell’utente autenticato
4. Se il recupero del profilo è avvenuto correttamente i dati dell’utente saranno accessibili tramite le seguenti proprietà dell’oggetto istanziato:

- `$cohesion->username` (Username utente autenticato)
- `$cohesion->id_sso` (ID della sessione SSO)
- `$cohesion->id_aspnet` (ID della sessione ASPNET)
- `$cohesion->profile` (Array contenente il profilo della persona)

Per la configurazione SAML 2.0 il funzionamento è analogo, cambiano solamente gli endpoint utilizzati e le possibilita di accesso per l'utente (SPID, CIE-ID, CNS, Cohesion, eIDAS, ...)

Profilo utente autenticato
--------------------------

[](#profilo-utente-autenticato)

Tramite la proprietà *profile* è possibile accedere ai dati del profilo utente. I valori ritornati dal sistema di autenticazione vengono istanziati come chiavi dell’array profile (non tutti i campi possono risultare valorizzati).

Cohesion2 restituisce i seguenti campi: titolo, nome, cognome, sesso, login, codice\_fiscale, telefono, localita\_nascita, provincia\_nascita, cap\_nascita, regione\_nascita, data\_nascita, nazione\_nascita, gruppo, ruolo, email, email\_certificata, telefono\_ufficio, fax\_ufficio, numero\_cellulare, indirizzo\_residenza, localita\_residenza, provincia\_residenza, cap\_residenza, regione\_residenza, nazione\_residenza, professione, settore\_azienda, profilo\_familiare, tipo\_autenticazione (PW , PIN , CF).

SAML 2.0 restituisce i seguenti campi:

- address (alias: indirizzo\_residenza)
- companyFiscalNumber (alias: Codice\_fiscale\_persona\_giuridica)
- countyOfBirth (alias: provincia\_nascita)
- dateOfBirth (data nel formato inglese yyyy-mm-dd)
- data\_nascita (data nel formato italiano gg/mm/aaaa)
- digitalAddress
- email\_certificata
- email (alias: Indirizzo\_di\_posta\_elettronica)
- familyName (alias: cognome)
- fiscalNumber (codice fiscale preceduto da TINIT-)
- codice\_fiscale
- gender (alias: sesso)
- ivaCode (alias: Partita\_IVA)
- name (alias: nome)
- placeOfBirth (codice istat comune di nascita)
- localita\_nascita (nome del comune di nascita)
- spidCode (alias: Codice\_identificativo\_SPID)
- tipo\_autenticazione
- login (contiene il codice fiscale)

Esempio:

```
      echo $cohesion->profile['nome'].' '.$cohesion->profile['cognome'];
```

Procedura di logout
-------------------

[](#procedura-di-logout)

Per chiudere la sessione locale e disconnettere l’utente dal sistema di SSO utilizzare il metodo logout():

```
      $cohesion = new Cohesion2;
      $cohesion->logout();
```

L’esempio completo è visualizzabile nel file *test/logout.php* o nel file *test/logout\_saml20.php*Per chiudere, eventualmente, solo la sessione locale lasciando aperta quella del SSO utilizzare il metodo logoutLocal():

```
      $cohesion = new Cohesion2;
      $cohesion->logoutLocal();
```

Limitazione dei metodi di autenticazione permessi
-------------------------------------------------

[](#limitazione-dei-metodi-di-autenticazione-permessi)

Il metodo setAuthRestriction permette di limitare i metodi di autenticazione permessi .

```
      $cohesion->setAuthRestriction('1,2,3');
```

I valori 0,1,2,3 indicano i livelli di autenticazione da mostrare nella pagina di login Cohesion:

- 0 = autenticazione con Utente e Password
- 1 = autenticazione con Utente, Password e PIN
- 2 = autenticazione con Smart Card
- 3 = autenticazione di Dominio (valida solo per utenti interni alla rete regionale)

E’ possibile nascondere o visualizzare le modalità di autenticazione togliendo o aggiungendo i rispettivi valori separati da una virgola. L’ordine è ininfluente.

N.B. Se si intende limitare l’accesso in base al tipo di autenticazione, è necessario, oltre ad utilizzare tale metodo, inserire un controllo per gli utenti che risultino già autenticati in SSO.

```
      if($cohesion->profile['tipo_autenticazione']!='PW'){
          echo 'OK puoi usare il servizio';
      }
      else echo 'Autenticazione debole non permessa';
```

Autori e storia del progetto
----------------------------

[](#autori-e-storia-del-progetto)

Libreria creata come lavoro personale da Andrea Vallorani ()

- 2015-06-16 pubblicata ver. 2.1.0
- 2015-06-31 pubblicata ver. 2.1.1
- 2015-10-13 pubblicata ver. 2.1.2
- 2018-04-25 pubblicata ver. 2.2.0
- 2023-03-20 integrate modifiche di @xavbeta dal fork )
- 2023-03-27 pubblicata ver. 3.0.0
- 2026-05-04 ver. 4.0.0 — modernizzazione a PHP 8.3:
    - requisito minimo PHP 8.3, autoload PSR-4, dichiarazioni `strict_types` e tipizzazione completa di proprietà e metodi
    - chiamate HTTPS riscritte con cURL e verifica TLS attiva di default (rimossa la dipendenza da `allow_url_fopen`)
    - sessione salvata come array invece di oggetto serializzato (elimina il rischio di PHP Object Injection); le sessioni 3.x non sono compatibili
- 2026-05-05 ver. 4.0.1 — release patch documentale: integrazione di `cohesion2/README.doc` nel README.md e rimozione del binario duplicato; nessuna modifica al codice
- 2026-05-12 ver. 4.0.2 — fix del binding SAML 2.0 HTTP-POST in `auth()`: il payload `auth` viene ora letto anche da `$_POST` (con precedenza a `$_GET`), risolvendo il loop di redirect sulla callback osservato con SPID/CIE attraverso il WAYF di Regione Marche. La lettura è esplicita su `$_GET`/`$_POST`, mai su `$_REQUEST` (CWE-565)

Errori comuni
-------------

[](#errori-comuni)

**`Session has already been started by session.auto-start or session_start()`**

Verificare che nel codice non ci siano chiamate alla funzione `session_start()`*dopo* l'istanziazione della classe `Cohesion2`: il costruttore avvia la sessione automaticamente se non è ancora attiva.

**`ERRORE: il server XXX non è abilitato all'utilizzo di COHESION`**

Il server applicativo non è registrato lato Cohesion2. Due strade:

- richiedere al referente Cohesion2 della Regione Marche l'abilitazione dell'IP di produzione;
- in fase di sviluppo, disabilitare temporaneamente il Single Sign-On con `$cohesion->useSSO(false);` (l'utente verrà sempre rediretto alla pagina di login senza il check preventivo della sessione SSO).

Appendice — esempi di XML scambiati con Cohesion2
-------------------------------------------------

[](#appendice--esempi-di-xml-scambiati-con-cohesion2)

Riferimento per chi debugga il flusso. Il payload effettivamente inviato viene costruito da `Cohesion2::buildAuthXml()` e codificato in base64 + urlencode prima di essere passato in querystring.

### Richiesta inviata alla maschera di login

[](#richiesta-inviata-alla-maschera-di-login)

```

        TEST

        https://app.example.it/login.php?cohesionCheck=1]]>
        https://app.example.it/login.php?cohesionCheck=1]]>

        AuthRestriction=0,1,2,3
        0,1,2,3

```

### Risposta ricevuta dalla maschera di login

[](#risposta-ricevuta-dalla-maschera-di-login)

```

        nome.cognome
        1
        TEST
        OK
        B0C0E8C2C6ECACB4D096FA8C14D37B25...
        1h5h2f3r0nfeoazu3seeue4f
        https://app.example.it/login.php?cohesionCheck=1
        https://app.example.it/login.php?cohesionCheck=1
        OK
        179422C462F5C75194F9D0863025EC34...
        1h5h2f3r0nfeoazu3seeue4f

        Password
        cohesion2.regione.marche.it

```

### Risposta del metodo `GetCredential` (profilo utente)

[](#risposta-del-metodo-getcredential-profilo-utente)

```

        ANDREA
        VALLORANI
        M
        vallorani
        XXXXXXXXXXXX
        XXXXX
        FERMO
        XX
        00/00/0000
        andrea.vallorani@gmail.com

        VIA XXXX
        XXXXXX
        XX
        00000
        PW

```

###  Health Score

51

—

FairBetter than 95% of packages

Maintenance94

Actively maintained with recent releases

Popularity3

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity84

Battle-tested with a long release history

 Bus Factor1

Top contributor holds 73.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~497 days

Recently: every ~285 days

Total

9

Last Release

28d ago

Major Versions

2.2.0 → 3.0.02023-03-27

3.0.1 → v4.0.02026-05-05

PHP version history (3 changes)2.1.0PHP &gt;=5.0.0

3.0.0PHP &gt;=5.4.0

v4.0.0PHP ^8.3

### Community

Maintainers

![](https://www.gravatar.com/avatar/e2746081defdb6d34584923d34d843270829b0482f53f74dbf7c8fcbfd3d60dd?d=identicon)[efumanti](/maintainers/efumanti)

---

Top Contributors

[![andreaval](https://avatars.githubusercontent.com/u/1799561?v=4)](https://github.com/andreaval "andreaval (58 commits)")[![efumanti](https://avatars.githubusercontent.com/u/272243596?v=4)](https://github.com/efumanti "efumanti (21 commits)")

---

Tags

phpSSOsingle sign onSAML 2.0eidasSPiDCohesion2Regione Marche

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/efumanti-cohesion2-library/health.svg)

```
[![Health](https://phpackages.com/badges/efumanti-cohesion2-library/health.svg)](https://phpackages.com/packages/efumanti-cohesion2-library)
```

###  Alternatives

[humanmade/wp-simple-saml

WordPress Simple SAML plugin

123297.5k3](/packages/humanmade-wp-simple-saml)[korotovsky/sso-sp-bundle

Single-sign-on bundle for Symfony2. Service Provider part.

3316.0k](/packages/korotovsky-sso-sp-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
