OAuth2-server-autorisatie

· Componenten

Vanaf sgcWebSockets 4.4.5 wordt het OAuth2-protocol ondersteund op de servercomponenten.

OAuth2 stelt applicaties van derden in staat om beperkte toegang te krijgen tot een HTTP-service, ofwel namens een resource owner ofwel doordat de applicatie van derden namens zichzelf toegang krijgt. Dankzij OAuth2 kunnen serviceproviders en consumer-applicaties op een veilige manier met elkaar communiceren.

TsgcHTTP_OAuth2_Server

Deze component biedt de OAuth2-protocolimplementatie in de servercomponenten.

De servercomponenten hebben een property Authorization.OAuth.OAuth2 waaraan je een instantie van TsgcHTTP_OAuth2_Server kunt toewijzen; als Authentication is ingeschakeld en de OAuth2-property is gekoppeld aan de OAuth2-servercomponent, vereisen de WebSocket- en HTTP-aanvragen een Bearer-token om te worden verwerkt; anders wordt de verbinding automatisch gesloten.

Voorbeeld 

Laten we een eenvoudig OAuth2-servervoorbeeld maken met een TsgcWebSocketHTTPServer.

Maak eerst een nieuwe TsgcWebSocketHTTPServer die luistert op poort 443 en een self-signed certificaat gebruikt in het bestand sgc.pem.

oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 80;
oServer.SSLOptions.Port := 443;
oServer.SSLOptions.CertFile := 'sgc.pem';
oServer.SSLOptions.KeyFile := 'sgc.pem';
oServer.SSLOptions.RootCertFile := 'sgc.pem';
oServer.SSL := True; 

Maak vervolgens een nieuwe instantie van TsgcHTTP_OAuth2_Server en wijs deze toe aan de eerder gemaakte server.

Registreer een nieuwe applicatie met de volgende waarden:

Name: MyApp

RedirectURI: http://127.0.0.1:8080

ClientId: client-id

ClientSecret: client-secret

OAuth2 := TsgcHTTP_OAuth2_Server.Create(nil);
OAuth2.Apps.AddApp('MyApp', 'http://127.0.0.1:8080', 'client-id', 'client-secret');
oServer.Authentication.Enabled := True;
oServer.Authentication.OAuth.OAuth2 := OAuth2; 

Handel vervolgens het event OnOAuth2Authentication van de OAuth2-servercomponent af en implementeer je eigen methode om gebruikers te laten inloggen. Ik gebruik het paar "user/secret" om een login te accepteren.

procedure OnAuth2Authentication(Connection: TsgcWSConnection; OAuth2: TsgcHTTPOAuth2Request; aUser, aPassword: string; var Authenticated: Boolean);
begin
  if ((aUser = 'user') and (aPassword = 'secret')) then
    Authenticated := True;
end; 

Start ten slotte de server en gebruik een OAuth2-client om in te loggen; je kunt bijvoorbeeld de TsgcHTTP_OAuth2_Client gebruiken die in de sgcWebSockets-bibliotheek is opgenomen.

Vraag een nieuw access token aan; er wordt een nieuwe webbrowser-sessie getoond en de gebruiker moet de verbinding toestaan en vervolgens inloggen.


Bij een succesvolle login wordt een nieuw token aan de client teruggegeven. Daarna moeten alle aanvragen dit bearer-token in de HTTP-headers bevatten.