Autorización mediante proveedores OAuth2 externos

· Componentes

Desde sgcWebSockets 2022.3.0 puedes usar proveedores OAuth2 externos para autenticar las solicitudes recibidas por tu servidor.

El componente OAuth2 Server Provider permite integrar proveedores OAuth2 externos (como Azure AD, Google, Facebook...) en tu componente servidor (por ejemplo un servidor HTTP), de modo que un usuario pueda iniciar sesión con credenciales de Azure AD y, si la autenticación es correcta, el servidor HTTP pueda dar acceso a recursos protegidos.

Flujo del OAuth2 Server Provider 

El componente OAuth2 Provider Server permite autenticarse mediante un proveedor OAuth2 externo (como Azure AD, Google...) para acceder a los recursos protegidos de tu servidor. Ejemplo: puedes configurar tu servidor HTTP y permitir el inicio de sesión con las credenciales de Azure a tus usuarios, de modo que si el login es correcto, permitirás el acceso a los recursos protegidos del servidor para esos usuarios.

El proceso de autenticación se realiza desde el lado del servidor y los tokens OAuth2 no se comparten con los clientes. Esto significa que cuando un usuario inicia sesión con Azure, por ejemplo, si la autenticación es correcta, Azure devuelve un Access Token que permite enviar solicitudes al servidor de Azure para obtener cierta información (según el scope) sobre el perfil del usuario, correos... Este Access Token NO SE COMPARTE con el cliente (por ejemplo, un navegador web); en lugar de devolver el Access Token al cliente, el servidor crea un ID aleatorio que se vincula internamente con el Access Token, de forma que cada vez que el cliente (el navegador) quiere hacer una llamada al servidor OAuth2, usa el ID público y el servidor usa este ID para obtener el Access Token OAuth2 y proxiar las solicitudes HTTP.

A continuación tienes un ejemplo de cómo funciona la autenticación OAuth2. El ejemplo usará la configuración de Azure AD descrita en el siguiente enlace OAuth2 Provider Azure AD.

Arranca el servidor

El servidor empieza a escuchar en localhost y en el puerto 443. El servidor HTTP de sgcWebSockets está enlazado con el componente OAuth2 Server Provider y la propiedad Authentication está habilitada.

Antes de iniciar el servidor, se registra el proveedor OAuth2 de Azure mediante la siguiente llamada de método.

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'
);

El usuario inicia sesión

El usuario abre un nuevo navegador y va al endpoint "/login".

El servidor detecta que el endpoint "/login" se usa para iniciar sesión mediante el proveedor de Azure y, por tanto, redirige a

https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/authorize

Y comienza el flujo de autenticación OAuth2.

Autenticación OAuth2

El usuario es redirigido al endpoint de autenticación del servidor OAuth2; ahora debe iniciar sesión con sus credenciales y aceptar los términos de la aplicación OAuth2.

Si la autorización es correcta, Azure AD envía un Code a la url

https://localhost/callback

Validar el Code OAuth2

Ahora el servidor ha recibido un code de Azure y realizará una conexión interna a Azure (servidor a servidor) para validar que este token es correcto (y evitar que alguien intente atacar el servidor).

El servidor conecta a

https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/token

Pasando algunos parámetros como el code recibido y el clientsecret, si la validación es correcta, Azure devuelve el Access Token que se puede usar para acceder a los recursos protegidos de Azure como leer el perfil, el correo...

Access Token correcto

Cuando el servidor recibe un AccessToken válido, se llama al evento OnOAuth2ProviderTokenValid, donde puedes configurar cómo se almacena el AccessToken (si se almacena) accediendo a la clase parámetro TsgcHTTPOAuth2ProviderToken

AccesToken: es el token OAuth2 devuelto por Azure

ID: es el identificador público almacenado como cookie.

En este evento puedes configurar qué hacer tras una autenticación correcta. Por ejemplo, si quieres redirigir al usuario a la URL privada, usa lo siguiente

Response.Redirect.URL := 'https://localhost/private';

Enviar solicitudes a Azure

Ahora puedes enviar solicitudes al servidor de Azure usando el ID público almacenado como cookie.

Ejemplo: si quieres leer los datos del perfil, usa el siguiente método.

Get('ID', 'https://graph.microsoft.com/v1.0/me');

Donde ID es el identificador público.

Descargar la demo OAuth2 Azure AD compilada para Windows