Inicio de sesión en Delphi con Passkeys, SAML SSO, LDAP y TOTP 2FA

· Componentes
Inicio de sesión en Delphi con Passkeys, SAML SSO, LDAP y TOTP 2FA

La pantalla de inicio de sesión es la parte de una aplicación empresarial sobre la que todos los clientes tienen una opinión. ¿Podemos iniciar sesión con nuestra cuenta de Entra ID? ¿Admite passkeys? Nuestros auditores quieren dos factores. Nuestros usuarios están en Active Directory, ¿por qué necesitan otra contraseña? Y el correo que envía tu aplicación dejó de funcionar el día en que Microsoft 365 rechazó la contraseña en la configuración SMTP.

Cada una de esas preguntas es un protocolo con su propia especificación, su propio XML o ASN.1, y sus propias formas de quedarse casi bien. Los nuevos componentes de autenticación empresarial las responden como componentes Delphi. Se incluyen en las ediciones Enterprise y All-Access de sgcWebSockets y en el paquete sgcAuth, y los mismos componentes forman parte de sgcWebSockets .NET.

Passkeys, tal como los usuarios los esperan

El servidor WebAuthn ahora cubre lo que la gente realmente quiere decir cuando habla de passkeys:

Inicio de sesión único SAML

Los grandes clientes no quieren que su personal tenga una cuenta en tu aplicación. Quieren que inicien sesión con el proveedor de identidad que la empresa ya utiliza. TsgcSAMLServiceProvider convierte tu aplicación en un proveedor de servicios SAML 2.0 para Entra ID, Okta, AD FS, Google Workspace y Keycloak. El proveedor de identidad se encarga del inicio de sesión, tu aplicación recibe una aserción, y la firma de esa aserción se valida antes de que veas ningún nombre de usuario.

Inicio de sesión en Active Directory y LDAP

Para la aplicación que se ejecuta dentro de la red de la empresa, los usuarios ya tienen una contraseña: la de Windows. TsgcLDAPClient comprueba un nombre de usuario y una contraseña contra Active Directory o cualquier directorio LDAP, mediante LDAPS o StartTLS para que la contraseña nunca cruce la red en claro. Asigna ldapsecLDAPS o ldapsecStartTLS a Security y llama a Authenticate.

Saber quién es el usuario solo responde la mitad de la pregunta. GetUserGroups devuelve los grupos a los que pertenece la cuenta, incluidos los grupos anidados, de modo que “¿es este usuario un aprobador de facturas?” es una sola llamada en lugar de una búsqueda recursiva que tienes que escribir y depurar tú mismo.

Códigos de doble factor desde una aplicación autenticadora

TsgcTOTPAuthenticator genera y comprueba los códigos de seis dígitos de Google Authenticator, Microsoft Authenticator y cualquier otra aplicación TOTP. El registro consiste en un secreto y una URI que muestras como código QR. El inicio de sesión es una sola llamada:

uses
  sgcAuth_TOTP, sgcBase_Helpers;

var
  oTOTP: TsgcTOTPAuthenticator;
  vSecret, vURI: string;
  vLastStep: Int64;
begin
  oTOTP := TsgcTOTPAuthenticator.Create(nil);
  try
    oTOTP.Issuer := 'MyApp';

    // enrolment: store vSecret with the user, show vURI as a QR code
    vSecret := oTOTP.GenerateSecret;
    vURI := oTOTP.GetProvisioningURI('john@example.com', vSecret);

    // sign-in: vLastStep is the last step accepted for this user, -1 the first time
    vLastStep := -1;
    if oTOTP.VerifyCode(vSecret, txtCode.Text,
      StrToInt64(GetDateTimeUnix(Now)), vLastStep) then
      ShowMessage('Signed in') // save vLastStep, this code is now spent
    else
      ShowMessage('Wrong, expired or already used');
  finally
    oTOTP.Free;
  end;
end;

Esa sobrecarga es la protección contra reproducción: un código que ya se ha aceptado se rechaza, incluso dentro de sus propios treinta segundos, de modo que un código leído por encima del hombro de alguien no vale nada una vez que se ha usado. Para el día en que se pierda el teléfono, GenerateRecoveryCodes rellena una lista con códigos de recuperación de un solo uso. Guárdalos como guardas las contraseñas.

Inicio de sesión con OpenID Connect

TsgcHTTP_OIDC_Client inicia la sesión de los usuarios con cualquier proveedor OpenID Connect. Lee el documento de descubrimiento del proveedor, de modo que la configuración es una URL de emisor y un ID de cliente en lugar de una lista de endpoints copiados a mano. Valida el token de ID que recibe, y las mismas claves de firma validan los tokens portador que llegan a tu propia API REST, incluidos los tokens de aplicaciones multiinquilino de Entra ID, donde el tenant de cada cliente firma con su propio emisor.

OAuth2 para el correo de Microsoft 365 y Gmail

Microsoft 365 y Gmail esperan OAuth2, no una contraseña, de SMTP, IMAP y POP3. TsgcMailOAuth2 obtiene el token de acceso, lo renueva y construye la cadena XOAUTH2 con la que inicia sesión tu sesión SMTP, IMAP o POP3. Elige el proveedor y los protocolos, dale tu ID de cliente, y guarda el token de actualización cuando se dispare OnTokensChanged. Un servicio o una aplicación de consola sin navegador puede usar en su lugar el flujo de código de dispositivo.

Prueba las demos

Cada componente tiene una demo ejecutable en Demos\26.Authentication:

Documentación

Dónde conseguirlos

Los componentes están incluidos en las ediciones Enterprise y All-Access de sgcWebSockets, para Delphi, C++ Builder y .NET. Si solo necesitas autenticación, el paquete sgcAuth los ofrece por separado. Son aditivos: nada cambia en una aplicación existente hasta que colocas uno en un formulario.

Sigue leyendo

Míralo en vídeo

Hay un vídeo breve, “Delphi login with passkeys, SAML SSO, Active Directory LDAP and TOTP 2FA”, en el canal de eSeGeCe.

¿Preguntas, comentarios o ayuda para integrar esto en tu página de inicio de sesión? Ponte en contacto. Recibirás respuesta de las personas que escribieron el código.