Il componente OAuth2 Provider Server consente di autenticarsi utilizzando un provider OAuth2 esterno (come Azure AD o Google) per accedere alle risorse protette del Suo server. Esempio: può configurare il Suo server HTTP per consentire agli utenti di accedere utilizzando le credenziali Azure; se l'accesso ha esito positivo, tali utenti potranno accedere alle risorse protette del Suo server.
Il processo di autenticazione avviene lato server e i token OAuth2 non vengono condivisi con i client. Ciò significa che quando l'utente effettua l'accesso tramite Azure ad esempio, se l'autenticazione ha esito positivo, Azure restituisce un Access Token che consente di inviare richieste al server Azure per ottenere alcune informazioni (a seconda dello scope) sul profilo utente, email ecc. Questo Access Token NON VIENE CONDIVISO con il client (ad esempio un browser web). Invece di restituire l'Access Token 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, utilizzi l'ID pubblico e il server usi questo ID per ottenere l'Access Token OAuth2 e fare da proxy alle richieste HTTP.
Di seguito è riportato un esempio di come funziona l'autenticazione OAuth2. L'esempio utilizzerà la configurazione Azure AD descritta nel seguente link OAuth2 Provider Azure AD.
Avvia il Server
Il server inizia l'ascolto su localhost e sulla porta 443. Il server HTTP di sgcWebSockets è collegato al componente OAuth2 Server Provider e la proprietà Authentication è abilitata.
Prima che il server venga avviato, il provider Azure OAuth2 viene registrato tramite la seguente chiamata al 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'
);
Accessi utente
L'utente apre un nuovo browser web e accede all'endpoint '/login'.
Il server rileva che l'endpoint '/login' viene utilizzato per accedere tramite il provider Azure, quindi reindirizza a
https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/authorize
E il flusso di autenticazione OAuth2 ha inizio.
Autenticazione OAuth2
L'utente viene reindirizzato all'Authentication Endpoint del server OAuth2 e ora deve effettuare l'accesso utilizzando le credenziali e accettare i termini dell'applicazione OAuth2.
Se l'autorizzazione ha esito positivo, Azure AD invia un Codice all'url
https://localhost/callback
Convalida il codice OAuth2
Ora, il server ha ricevuto un codice da Azure ed effettuerà una connessione interna ad Azure (da server a server) per verificare che questo token sia corretto (ed evitare che qualcuno stia cercando di violare 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 il Token di Accesso che può essere utilizzato per accedere alle Risorse Protette Azure come leggere il profilo, l'email...
Token di Accesso Valido
Quando il server riceve un AccessToken valido, viene chiamato l'evento OnOAuth2ProviderTokenValid; qui è possibile configurare come viene memorizzato l'AccessToken (se viene memorizzato) accedendo alla classe di parametri TsgcHTTPOAuth2ProviderToken.
AccesToken: è il Token OAuth2 restituito da Azure
ID: è l'identificatore pubblico memorizzato come cookie.
In questo evento è possibile configurare le azioni da eseguire dopo una autenticazione riuscita; ad esempio: se si desidera reindirizzare l'utente all'URL privato, utilizzare quanto segue
Response.Redirect.URL := 'https://localhost/private';
Invia Richieste ad Azure
Ora è possibile inviare richieste al server Azure utilizzando l'ID pubblico memorizzato come cookie.
Esempio: se si desidera leggere i dati del profilo, utilizzare il seguente metodo.
Get('ID', 'https://graph.microsoft.com/v1.0/me');
Dove ID è l'identificatore pubblico.