OAuth2 Server: autorización

· Componentes

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.