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

Esempio

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

Endpoint disponibili

Authorization Endpoint

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

Token Endpoint

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

UserInfo Endpoint

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

Passo 1: Reindirizzare l’utente

Quando l’utente clicca sul pulsante "Accedi con SimosNap" deve essere reindirizzato all'endpoint di autorizzazione OAuth.

Richiesta di autorizzazione

$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;

Passo 2: Ricevere il codice di autorizzazione

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

Esempio di redirect

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

Prima di continuare è fondamentale verificare il parametro state per prevenire attacchi CSRF.

Verifica del parametro state

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

Passo 3: Ottenere un Access Token

Il codice ricevuto deve essere scambiato con un token.

Richiesta del token di accesso

$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);

Risposta tipica

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

Passo 4: Recuperare i dati dell’utente

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

$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);

           ‌

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
}

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:

$_SESSION['user_id']     = $user['sub'];
$_SESSION['nickname']    = $user['nickname'];
$_SESSION['irc_account'] = $user['irc_account'];
$_SESSION['profile_url'] = $user['profile_url'];

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!

Documentazione: https://www.simosnap.org/resources#oauth