Desde sgcWebSockets 4.4.5 el protocolo OAuth2 es compatible con los componentes de servidor.
OAuth2 permite que aplicaciones de terceros reciban un acceso limitado a un servicio HTTP, ya sea en nombre del propietario del recurso o permitiendo que la aplicación de terceros obtenga acceso en su propio nombre. Gracias a OAuth2, los proveedores de servicios y las aplicaciones de consumo pueden interactuar entre sí de forma segura.
TsgcHTTP_OAuth2_Server
Este componente proporciona la implementación del protocolo OAuth2 en los componentes de servidor.
Los componentes de servidor tienen una propiedad llamada Authorization.OAuth.OAuth2 a la que puedes asignar una instancia de TsgcHTTP_OAuth2_Server. Así, si la autenticación está activada y la propiedad OAuth2 se vincula al componente OAuth2 Server, las peticiones WebSocket y HTTP requerirán un Bearer Token para ser procesadas; si no, la conexión se cerrará automáticamente.
Ejemplo
Vamos a hacer un ejemplo sencillo de servidor OAuth2, usando un TsgcWebSocketHTTPServer.
Primero, crea un nuevo TsgcWebSocketHTTPServer que escuche en el puerto 443 y usando un certificado autofirmado en el archivo 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;
Después crea una nueva instancia de TsgcHTTP_OAuth2_Server y asígnala al servidor creado previamente.
Registra una nueva Aplicación con los siguientes valores:
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;
A continuación, gestiona el evento OnOAuth2Authentication del componente servidor OAuth2 e implementa tu propio método para iniciar sesión de los usuarios. Usaré el par "user/secret" para aceptar un inicio de sesión.
procedure OnAuth2Authentication(Connection: TsgcWSConnection; OAuth2: TsgcHTTPOAuth2Request; aUser, aPassword: string; var Authenticated: Boolean);
begin
if ((aUser = 'user') and (aPassword = 'secret')) then
Authenticated := True;
end;
Por último, inicia el servidor y utiliza un cliente OAuth2 para iniciar sesión; como ejemplo puedes usar el TsgcHTTP_OAuth2_Client incluido con la librería sgcWebSockets.

Solicita un nuevo Access Token; se abrirá una nueva sesión del navegador y el usuario deberá Permitir la conexión y luego iniciar sesión.

Si el inicio de sesión es correcto se devolverá un nuevo Token al cliente. A partir de ese momento todas las peticiones deben incluir este bearer token en las cabeceras HTTP.

