Autorisation serveur OAuth2

· Composants

À partir de sgcWebSockets 4.4.5, le protocole OAuth2 est pris en charge sur les composants serveur.

OAuth2 permet aux applications tierces de recevoir un accès limité à un service HTTP, soit au nom d'un propriétaire de ressource, soit en permettant à une application tierce d'obtenir l'accès pour son propre compte. Grâce à OAuth2, fournisseurs de services et applications consommatrices peuvent interagir entre eux de manière sécurisée.

TsgcHTTP_OAuth2_Server

Ce composant fournit l'implémentation du protocole OAuth2 dans les composants côté serveur.

Les composants serveur disposent d'une propriété appelée Authorization.OAuth.OAuth2, à laquelle tu peux assigner une instance de TsgcHTTP_OAuth2_Server. Ainsi, si l'authentification est activée et que la propriété OAuth2 est rattachée au composant serveur OAuth2, les requêtes WebSocket et HTTP nécessitent un jeton Bearer pour être traitées ; sinon la connexion est fermée automatiquement.

Exemple 

Faisons un exemple simple de serveur OAuth2, en utilisant un TsgcWebSocketHTTPServer.

Crée d'abord un nouveau TsgcWebSocketHTTPServer qui écoute sur le port 443 et utilise un certificat auto-signé dans le fichier 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; 

Crée ensuite une nouvelle instance de TsgcHTTP_OAuth2_Server et assigne-la au serveur créé précédemment.

Enregistre une nouvelle application avec les valeurs suivantes :

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; 

Gère ensuite l'événement OnOAuth2Authentication du composant serveur OAuth2 et implémente ta propre méthode pour connecter les utilisateurs. J'utiliserai le couple « user/secret » pour accepter une connexion.

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

Enfin, démarre le serveur et utilise un client OAuth2 pour te connecter ; par exemple, tu peux utiliser TsgcHTTP_OAuth2_Client inclus dans la bibliothèque sgcWebSockets.

Demande un nouveau jeton d'accès ; une nouvelle session de navigateur web s'ouvre et l'utilisateur doit autoriser la connexion, puis se connecter.


Si la connexion réussit, un nouveau jeton est renvoyé au client. Toutes les requêtes doivent ensuite inclure ce jeton Bearer dans les en-têtes HTTP.