El componente servidor OAuth2 Provider le permite autenticarse mediante un proveedor OAuth2 externo (como Azure AD o Google) para acceder a los recursos protegidos de su servidor. Ejemplo: puede configurar su servidor HTTP para que los usuarios inicien sesión con credenciales de Azure; si el inicio de sesión es exitoso, dichos usuarios podrán acceder a los recursos protegidos de su servidor.
El proceso de autenticación se realiza en el lado del servidor y los tokens OAuth2 no se comparten con los clientes. Esto significa que cuando el usuario inicia sesión usando Azure, por ejemplo, si la autenticación es exitosa, Azure devuelve un Token de Acceso que permite enviar solicitudes al servidor de Azure para obtener información (según el ámbito) sobre el perfil de usuario, correos electrónicos... Este Token de Acceso NO SE COMPARTE con el cliente (por ejemplo, un navegador web); en lugar de devolver el Token de Acceso al cliente, el servidor crea un ID aleatorio vinculado internamente con el Token de Acceso, de modo que cada vez que el cliente (navegador web) quiera realizar una llamada al servidor OAuth2, usa el ID público y el servidor usa este ID para obtener el Token de Acceso OAuth2 y actuar como proxy de las solicitudes HTTP.
A continuación encontrará un ejemplo de cómo funciona la autenticación OAuth2. El ejemplo utilizará la configuración de Azure AD descrita en el siguiente enlace: OAuth2 Provider Azure AD.
Iniciar el Servidor
El servidor comienza a escuchar en localhost y en el puerto 443. El servidor HTTP de sgcWebSockets está vinculado al componente proveedor OAuth2 Server y la propiedad Authentication está habilitada.
Antes de iniciar el servidor, el proveedor Azure OAuth2 se registra mediante la siguiente llamada al 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'
);
Inicios de sesión de usuario
El usuario abre un nuevo navegador web y va al endpoint '/login'.
El servidor detecta que el endpoint '/login' se utiliza para iniciar sesión con el proveedor Azure, por lo que 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 punto de extremo 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 exitosa, Azure AD envía un código a la URL
https://localhost/callback
Validar el Código OAuth2
Ahora, el servidor ha recibido un código de Azure y realizará una conexión interna a Azure (de servidor a servidor) para validar que este token es correcto (y evitar que alguien intente hackear el servidor).
El servidor se conecta a
https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/token
Pasando algunos parámetros como el código recibido y el clientsecret, si la validación es correcta, Azure devuelve el Access Token que puede utilizarse para acceder a los recursos protegidos de Azure, como leer el perfil, el correo electrónico...
Token de acceso válido
Cuando el servidor recibe un AccessToken válido, se llama al evento OnOAuth2ProviderTokenValid, donde puede configurar cómo se almacena el AccessToken (si procede) accediendo a la clase de parámetro TsgcHTTPOAuth2ProviderToken
AccesToken: es el token OAuth2 devuelto por Azure
ID: es el identificador público almacenado como cookie.
En este evento puede configurar qué hacer tras una autenticación correcta; por ejemplo, si desea redirigir al usuario a la URL privada, utilice lo siguiente:
Response.Redirect.URL := 'https://localhost/private';
Enviar solicitudes a Azure
Ahora puede enviar solicitudes al servidor de Azure utilizando el ID público almacenado como cookie.
Ejemplo: si desea leer los datos del perfil, utilice el siguiente método.
Get('ID', 'https://graph.microsoft.com/v1.0/me');
Donde ID es el identificador público.