Da sgcWebSockets 2022.3.0 puoi usare provider OAuth2 esterni per autenticare le richieste ricevute dal tuo server.
Il componente OAuth2 Server Provider permette di integrare provider OAuth2 esterni (come Azure AD, Google, Facebook...) nel tuo componente server (come un server HTTP), in modo che un utente possa fare login utilizzando le credenziali Azure AD e, se l'autenticazione ha esito positivo, il server HTTP puo' fornire l'accesso a risorse protette.
Flusso del provider OAuth2 server
Il componente OAuth2 Provider Server permette di autenticarsi usando un provider OAuth2 esterno (come Azure AD, Google...) per accedere alle risorse protette del tuo server. Esempio: puoi configurare il tuo server HTTP per consentire ai tuoi utenti il login con le credenziali Azure, in modo che, se il login ha successo, autorizzi quegli utenti ad accedere alle risorse protette del tuo server.
Il processo di autenticazione avviene lato server e i token OAuth2 non vengono condivisi con i client: quando l'utente esegue il login usando Azure, ad esempio, se l'autenticazione ha successo, Azure restituisce un Access Token che permette di inviare richieste al server Azure per ottenere informazioni (a seconda dello scope) sul profilo utente, sulle email... Questo Access Token NON VIENE CONDIVISO con il client (ad esempio un browser web); invece di restituirlo al client, il server crea un ID casuale collegato internamente all'Access Token, in modo che ogni volta che il client (browser web) vuole effettuare una chiamata al server OAuth2 utilizza l'ID pubblico e il server usa questo ID per recuperare l'Access Token OAuth2 e fare il proxy delle richieste HTTP.
Qui sotto trovi un esempio di come funziona l'autenticazione OAuth2. L'esempio utilizza la configurazione Azure AD descritta nel seguente link OAuth2 Provider Azure AD.
Avvio del server
Il server si mette in ascolto su localhost e porta 443. Il server HTTP sgcWebSockets e' collegato al componente OAuth2 Server Provider e la proprieta' Authentication e' abilitata.
Prima dell'avvio del server, il provider OAuth2 Azure viene registrato con la seguente chiamata di metodo.
RegisterProvider(
'azure',
'90945b8d-f6b7-4b97-b2bd-21c3c90b5f3x',
'PN67Q~5m06c-~X_GMyMf9zMntmm5l2dt~3jVq',
'https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/authorize',
'https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/token',
'user.read',
'/login',
'https://localhost/callback'
);
Login dell'utente
L'utente apre un nuovo browser web e va all'endpoint '/login'.
Il server rileva che l'endpoint '/login' viene utilizzato per il login tramite provider Azure e quindi reindirizza a
https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/authorize
E inizia il flusso di autenticazione OAuth2.
Autenticazione OAuth2
L'utente viene reindirizzato all'endpoint di autenticazione del server OAuth2; ora deve fare login con le proprie credenziali e accettare i termini dell'applicazione OAuth2.
Se l'autorizzazione ha esito positivo, Azure AD invia un codice all'URL
https://localhost/callback
Validazione del codice OAuth2
A questo punto il server ha ricevuto un codice da Azure ed effettuera' una connessione interna verso Azure (da server a server) per convalidare che il token sia corretto (ed evitare che qualcuno tenti di compromettere il server).
Il server si connette a
https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/token
Passando alcuni parametri come il codice ricevuto e il clientsecret; se la validazione ha esito positivo, Azure restituisce l'Access Token utilizzabile per accedere alle risorse protette di Azure, come la lettura del profilo, dell'email...
Access Token ricevuto correttamente
Quando il server riceve un AccessToken valido viene chiamato l'evento OnOAuth2ProviderTokenValid, dove puoi configurare come l'AccessToken viene memorizzato (se viene memorizzato) accedendo alla classe parametro TsgcHTTPOAuth2ProviderToken
AccesToken: e' il token OAuth2 restituito da Azure
ID: e' l'identificatore pubblico memorizzato come cookie.
In questo evento puoi configurare cosa fare dopo un'autenticazione riuscita; ad esempio, se vuoi reindirizzare l'utente all'URL privato, usa quanto segue
Response.Redirect.URL := 'https://localhost/private';
Invio di richieste verso Azure
Ora puoi inviare richieste al server Azure utilizzando l'ID pubblico memorizzato come cookie.
Esempio: se vuoi leggere i dati del profilo, usa il seguente metodo.
Get('ID', 'https://graph.microsoft.com/v1.0/me');
Dove ID e' l'identificatore pubblico.
