in Architettura Software

Single Sign-On con KeyCloak e WordPress

Come abbiamo visto nei post precedenti, l’utilizzo di SSO consente di avere un unico punto centralizzato in cui gestire gli utenti (ed ovviamente tutto il processo di autenticazione/autorizzazione).

Come esempio di implementazione proveremo a collegare KeyCloak a WordPress.

Keycloak consente di gestire la configurazione in maniera piuttosto semplice e soprattutto esistono già delle immagini su docker.

Utilizzando il server docker configurato sul mio raspberry pi ho provato a configurare gli accessi degli utenti di WordPress tramite SSO.

La prima parte della configurazione riguarda ovviamente l’ambiente di KeyCloak, e si può trovare in questo post.

In particolare si dovranno seguire questi steps:

  • creazione di un Real
  • creazione degli utenti (con relativa password)
  • creazione di un client dedicato a WordPress (ClientId e Client Secret)
  • creazione dei ruoli che dovranno essere gestiti
  • configurare i mappers all’interno di KeyCloak per lo scambio di informazioni con il client
  • configurazione dei ruoli all’interno di wordpress
  • mappatura ta utenti e ruoli all’interno di wordpress

Quest’ultima parte è fondamentale perchè consente di aggiungere al token jwt le informazioni che dovranno essere esposte.

In particolare nel nostro caso dovremo utilizzare il mapper di tipo User Client Role, in modo da poter ricevere le informazioni relative ai ruoli.

Una volta abilitate, al momento della chiamata all’api /userInfo verrà restituito anche un array chiamato roles con all’interno i ruoli dell’utente loggato.

Tutti i passaggi descritti in precedenza sono pubblicati all’interno di questo post.

La configurazione di wordpress avviene utilizzando un plugin dedicato all’autenticazione, tramite openId Connect.

Il plugin che ho utilizzato nel mio test si chiama OpenID Connect Generic Client.

Si tratta un plugin che consente di abilitare OAuth2 all’interno di un sito wordpress.

Dopo aver indicato il tipo di autenticazione da utilizzare, e se integrare l’autenticazione in quella già esistente in wordpress, oppure abilitare la possibilità di creare degli shortcut in qualsiasi pagina/post dell’applicazione.

Ed ecco il vero core dell’applicazione: la configurazione dell’autenticazione con KeyCloak.

E’ necessario indicare il ClientId, la Secret Key ed il login dell’EndPoint.

Tutte queste informazioni sono recuperabili all’interno della configurazione del client all’interno di KeyCloak:

All’interno della sezione Credentials.

A questo punto sarà sufficiente effettuare il login al solito indirizzo wp-admin di wordpress per essere indirizzati alla login di KeyCloak.

Una volta effettuata l’autenticazione, verrà creato un nuovo utente all’interno di wordpress con il ruole proveniente da KeyCloak.

A questo punto rimangono ancora da configurare i ruoli all’interno di WordPress.

Il primo passaggio è quello di creare tutti i ruoli che dovranno essere utilizzati.

In particolare, avremo bisogno di una mappatura un pò piu’ evoluta e specifica rispetto a quella di wordpress.

Per questo motivo è necessario utilizzare un plugin dedicato per la gestione dei ruoli, come ad esempio User Role Editor.

Questo plugin consente di creare ruoli specifici, associadogli a ruoli già esistenti in wordpress.

Poichè a questo punto i ruoli arrivano direttamente da KeyCloak, è necessario modificare wordpress in modo da poter creare una sorta di mappatura con quelli di wordpress.

Il modo piu’ semplice è quello di modificare il file function.php di wordpress aggiungendo una funzione del tipo:

function assign_role($user,$user_claim){
   
     switch($user_claim['roles'][0]){
case 'Tipo 1':
          $role = 'role1';
        break;
case 'Tipo 2':
          $role = 'role2';
        break;
default:
          $role = 'role3';
        break;
     }
$user->set_role($role);
}

che legge il ruole all’interno di roles (della api userinfo) e lo rimappa sul ruolo di wordpress. L’invocazione di questa semplice funzione dovrà avvenire in fase di creazione utente in wordpress.

Facciamo quindi un ulteriore modifica al codice, inserendo:

add_action('openid-connect-generic-user-create', 'assign_role',10,2);

indicando che al momento della chiamata openid-connect-generic-user-create dovrà essere chiamata la funzione assign-role definita in precedenza.

A questo punto abbiamo configurato wordpress per appoggiarsi ad un servizio SSO esterno.