Integrare il Login SimosNap nel proprio sito con OAuth 2.0 e OpenID Connect
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