Sempre più siti web, community e progetti online preferiscono delegare l’autenticazione a provider esterni anziché gestire direttamente utenti e password.

Per questo motivo SimosNap IRC Network mette a disposizione un sistema di autenticazione basato su OAuth 2.0 e OpenID Connect che consente agli sviluppatori di integrare il login SimosNap nelle proprie applicazioni.

In questo articolo vedremo come funziona l’integrazione e come iniziare rapidamente.

‌             ‌

Perché utilizzare OAuth?

Gestire un sistema di login richiede tempo, manutenzione e attenzione alla sicurezza.

Utilizzando OAuth:

  • non devi gestire password degli utenti
  • non devi implementare procedure di recupero password
  • non devi occuparti della sicurezza delle credenziali
  • puoi utilizzare l’identità SimosNap già esistente

L’utente effettua il login direttamente sui sistemi SimosNap e la tua applicazione riceve solamente le informazioni autorizzate.

‌             ‌

Registrare un’applicazione

Per utilizzare il sistema OAuth è necessario registrare un’applicazione all’interno del proprio account SimosNap.

Durante la registrazione vengono generati:

  • Client ID
  • Client Secret
  • Redirect URI autorizzate
  • Scope consentiti

Ad esempio:

‌                   Client ID: my_application_123456789 Client Secret: xxxxxxxxxxxxxxxxxxxxxxxx Redirect URI: https://example.org/oauth/callback.php               text

‌             ‌

Endpoint disponibili

Authorization Endpoint

‌                   https://www.simosnap.org/rest/service.php/oauth/authorize               text

Token Endpoint

‌                   https://www.simosnap.org/rest/service.php/oauth/token               text

UserInfo Endpoint

‌                   https://www.simosnap.org/rest/service.php/oauth/userinfo               text

‌             ‌

Passo 1: Reindirizzare l’utente

Quando l’utente clicca sul pulsante “Accedi con SimosNap” deve essere inviato all’endpoint di autorizzazione.

Esempio PHP:

‌                   <?php $clientId = 'my_application_123456789'; $redirectUri = 'https://example.org/oauth/callback.php'; $state = bin2hex(random_bytes(16)); $_SESSION['oauth_state'] = $state; $params = [ 'response_type' => 'code', 'client_id' => $clientId, 'redirect_uri' => $redirectUri, 'scope' => 'openid profile irc', 'state' => $state ]; header( 'Location: https://www.simosnap.org/rest/service.php/oauth/authorize?' . http_build_query($params) ); exit;               php

‌             ‌

Passo 2: Ricevere il codice di autorizzazione

Dopo il login e il consenso dell’utente, SimosNap reindirizzerà il browser verso la tua callback.

Esempio:

‌                   https://example.org/oauth/callback.php?code=abc123&state=xyz456               text

Prima di continuare verifica sempre il parametro state.

‌                   <?php if ($_GET['state'] !== $_SESSION['oauth_state']) { die('Invalid state'); }               php

‌             ‌

Passo 3: Ottenere un Access Token

Il codice ricevuto deve essere scambiato con un token.

‌                   <?php $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => 'https://www.simosnap.org/rest/service.php/oauth/token', CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => http_build_query([ 'grant_type' => 'authorization_code', 'client_id' => $clientId, 'client_secret' => $clientSecret, 'redirect_uri' => $redirectUri, 'code' => $_GET['code'] ]) ]); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true);               php

Risposta tipica:

‌                   { "access_token": "xxxxxxxx", "token_type": "Bearer", "expires_in": 3600 }               json

‌             ‌

Passo 4: Recuperare i dati dell’utente

Una volta ottenuto il token è possibile interrogare l’endpoint UserInfo.

‌                   <?php $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => 'https://www.simosnap.org/rest/service.php/oauth/userinfo', CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $data['access_token'] ] ]); $userInfo = curl_exec($ch); curl_close($ch); $user = json_decode($userInfo, true);               php

‌             ‌

Informazioni disponibili

Attualmente l’endpoint UserInfo può restituire:

‌                   { "sub": "12345", "nickname": "SimosNap", "preferred_username": "SimosNap", "profile_url": "https://www.simosnap.org/user/stats:SimosNap/profile", "irc_account": "SimosNap", "is_oper": false }               json

Campi principali:

Campo

Descrizione

sub

Identificativo univoco utente

nickname

Nickname visualizzato

preferred_username

Username preferito

profile_url

URL profilo pubblico

irc_account

Account IRC associato

is_oper

Stato operatore IRC

‌             ‌

Gestione sessione locale

Una volta ottenuti i dati dell’utente è possibile creare una normale sessione applicativa.

Esempio:

‌                   <?php $_SESSION['user_id'] = $user['sub']; $_SESSION['nickname'] = $user['nickname']; $_SESSION['irc_account'] = $user['irc_account']; $_SESSION['profile_url'] = $user['profile_url'];               php

Da questo momento l’utente è autenticato sul tuo sito.

‌             ‌

Sicurezza

Per una corretta implementazione ricordati sempre di:

  • utilizzare HTTPS
  • verificare il parametro state
  • conservare il Client Secret in modo sicuro
  • validare sempre il redirect URI
  • non salvare password SimosNap
  • utilizzare sessioni sicure

‌             ‌

Un esempio reale: ChatItaly

ChatItaly utilizza già il sistema OAuth di SimosNap per gestire:

  • login utenti
  • Feed Community
  • votazioni
  • commenti
  • funzionalità social

L’applicazione non gestisce password e non mantiene un database utenti separato.

L’identità rimane centralizzata su SimosNap, mentre il sito può concentrarsi esclusivamente sulle proprie funzionalità.

‌             ‌

Vuoi integrare il tuo sito?

Se gestisci una community, un forum, un progetto open source o un servizio collegato al mondo IRC, puoi richiedere l’attivazione di un client OAuth e iniziare ad utilizzare il login SimosNap nella tua applicazione.

L’obiettivo è costruire un ecosistema di servizi interoperabili che condividano la stessa identità digitale, mantenendo il pieno controllo da parte degli utenti.

Buon coding!