Un account, più servizi
Gli utenti possono accedere ai siti compatibili usando il loro account SimosNap. La tua applicazione riceve solo i dati autorizzati dall’utente.
Integra il login SimosNap nel tuo sito o nella tua applicazione usando OAuth 2.0 e OpenID Connect. Gli utenti possono autenticarsi con il proprio account IRC senza creare nuove password e senza condividere credenziali con servizi esterni.
OAuth permette di collegare siti, community e strumenti esterni all’identità SimosNap senza dover gestire direttamente registrazioni, password e recupero credenziali.
Gli utenti possono accedere ai siti compatibili usando il loro account SimosNap. La tua applicazione riceve solo i dati autorizzati dall’utente.
Oltre al profilo pubblico, puoi leggere informazioni IRC utili come account registrato, nickname, avatar e alias collegati a NickServ.
La risposta userinfo include un uid numerico stabile che puoi usare per collegare commenti, preferiti, reputazione, ban o altre funzioni social senza dipendere dal nickname.
La password resta sempre su SimosNap. La tua applicazione riceve token temporanei e può accedere solo agli scope autorizzati.
Il flusso consigliato è Authorization Code Flow: l’utente viene mandato su SimosNap, autorizza l’applicazione e torna al tuo sito con un code temporaneo da scambiare lato server.
Prima di usare OAuth devi creare un’applicazione dal pannello account SimosNap. Ogni applicazione ha un Client ID pubblico e un Client Secret privato.
Indica un nome riconoscibile, il sito web dell’applicazione, la Redirect URI e i permessi che l’applicazione potrà richiedere agli utenti.
Nome applicazione: ChatItaly Sito web: https://example.com Redirect URI: https://example.com/oauth/callback.php Scope disponibili: openid profile irc
Un’integrazione reale parte da un pulsante di login che manda l’utente su SimosNap con i parametri OAuth corretti.
Questa è la URL verso cui reindirizzare l’utente quando preme il pulsante Accedi con SimosNap.
https://www.simosnap.org/rest/service.php/oauth/authorize
https://www.simosnap.org/rest/service.php/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=https%3A%2F%2Fexample.com%2Foauth%2Fcallback.php&scope=openid%20profile%20irc&state=RANDOM_STATE
Il pulsante può essere semplice: l’importante è costruire la URL lato server e usare uno state casuale per ogni tentativo di login.
<a href="https://www.simosnap.org/rest/service.php/oauth/authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=https%3A%2F%2Fexample.com%2Foauth%2Fcallback.php&scope=openid%20profile%20irc&state=RANDOM_STATE">
Accedi con SimosNap
</a>
Questi sono gli endpoint principali usati dal flusso OAuth. Gli endpoint token e userinfo restituiscono dati JSON.
Avvia il login OAuth e mostra il consenso all’utente.
https://www.simosnap.org/rest/service.php/oauth/authorize
Scambia l’authorization code con un access token. Questa chiamata deve essere fatta lato server, mai dal browser dell’utente.
https://www.simosnap.org/rest/service.php/oauth/token
grant_type=authorization_code client_id=CLIENT_ID client_secret=CLIENT_SECRET code=AUTHORIZATION_CODE redirect_uri=https://example.com/oauth/callback.php
{
"access_token": "ACCESS_TOKEN",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "REFRESH_TOKEN"
}
Restituisce le informazioni utente autorizzate dagli scope richiesti.
https://www.simosnap.org/rest/service.php/oauth/userinfo
Authorization: Bearer ACCESS_TOKEN
{
"sub": "hash-stabile-openid",
"uid": 12345,
"nickname": "Simos",
"preferred_username": "Simos",
"profile_url": "https://www.simosnap.org/user/stats:Simos/profile#info",
"avatar": "avatar.png",
"avatar_url": "https://www.simosnap.org/uploads/avatars/default/avatar.png",
"aliases": ["Simos", "H7-25", "sixxs", "simos|out"],
"irc_account": "Simos",
"is_oper": true
}
Gli scope definiscono quali informazioni l’applicazione può leggere. L’utente vede i permessi richiesti prima di autorizzare.
Abilita l’identificazione dell’utente tramite un subject stabile compatibile con OpenID Connect.
Permette di leggere nickname, profilo pubblico, avatar e alias collegati all’account SimosNap.
Permette di leggere il nome account IRC e alcune informazioni legate all’identità IRC, come lo stato operatore quando disponibile.
Permette di leggere l’indirizzo email solo se l’applicazione è autorizzata a richiederlo e l’utente concede il consenso.
Questo esempio mostra una callback minimale: verifica il code, scambia il token e legge userinfo. In produzione aggiungi gestione errori, verifica dello state e salvataggio sicuro della sessione.
Il Client Secret deve restare lato server. Non inserirlo mai in JavaScript o in pagine pubbliche.
<?php
session_start();
$clientId = 'CLIENT_ID';
$clientSecret = 'CLIENT_SECRET';
$redirectUri = 'https://example.com/oauth/callback.php';
if (!isset($_GET['code'])) {
exit('Authorization code mancante');
}
if (!isset($_GET['state']) || $_GET['state'] !== ($_SESSION['oauth_state'] ?? null)) {
exit('State non valido');
}
$tokenContext = stream_context_create([
'http' => [
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => http_build_query([
'grant_type' => 'authorization_code',
'client_id' => $clientId,
'client_secret' => $clientSecret,
'code' => $_GET['code'],
'redirect_uri' => $redirectUri
])
]
]);
$tokenResponse = file_get_contents('https://www.simosnap.org/rest/service.php/oauth/token', false, $tokenContext);
$tokenData = json_decode($tokenResponse, true);
if (empty($tokenData['access_token'])) {
exit('Access token non ricevuto');
}
$userContext = stream_context_create([
'http' => [
'method' => 'GET',
'header' => 'Authorization: Bearer ' . $tokenData['access_token']
]
]);
$userResponse = file_get_contents('https://www.simosnap.org/rest/service.php/oauth/userinfo', false, $userContext);
$userInfo = json_decode($userResponse, true);
$_SESSION['user_uid'] = $userInfo['uid'];
$_SESSION['user_nickname'] = $userInfo['nickname'];
header('Location: /');
exit;
OAuth è semplice da integrare, ma richiede attenzione nella gestione di redirect, state, secret e token.
Genera uno state casuale per ogni login, salvalo in sessione e confrontalo nella callback prima di scambiare il code.
Il Client Secret identifica la tua applicazione. Deve restare sul server e non deve essere condiviso pubblicamente.
Access token e refresh token non devono comparire in URL, pagine HTML, log pubblici o messaggi di errore visibili agli utenti.
Registra Redirect URI HTTPS e proteggi la callback della tua applicazione con una configurazione web corretta.
Gli errori OAuth indicano che una richiesta non è valida, che il consenso è stato annullato o che un token non può essere usato.
Il Client ID non esiste, l’applicazione è disabilitata oppure il Client Secret non corrisponde.
L’authorization code è già stato usato, è scaduto o non corrisponde alla Redirect URI usata nella richiesta originale.
L’applicazione ha richiesto scope non esistenti o non autorizzati per quel client.
L’utente ha annullato l’autorizzazione. La tua applicazione dovrebbe mostrare un messaggio chiaro e permettere di riprovare.