Login em Delphi com Passkeys, SAML SSO, LDAP e TOTP 2FA

· Componentes
Login em Delphi com Passkeys, SAML SSO, LDAP e TOTP 2FA

A tela de login é a única parte de uma aplicação empresarial sobre a qual todo cliente tem uma opinião. Podemos entrar com nossa conta Entra ID? Ela suporta passkeys? Nossos auditores querem dois fatores. Nossos usuários estão no Active Directory, por que precisam de outra senha? E o e-mail que sua aplicação envia parou de funcionar no dia em que o Microsoft 365 recusou a senha nas configurações SMTP.

Cada uma dessas perguntas é um protocolo com sua própria especificação, seu próprio XML ou ASN.1, e suas próprias formas de ficar quase certo. Os novos componentes de autenticação empresarial respondem a elas como componentes Delphi. Fazem parte das edições Enterprise e All-Access do sgcWebSockets e do pacote sgcAuth, e os mesmos componentes também fazem parte do sgcWebSockets .NET.

Passkeys, do jeito que os usuários esperam

O servidor WebAuthn agora cobre o que as pessoas realmente querem dizer quando falam de passkeys:

Single Sign-On SAML

Grandes clientes não querem que sua equipe tenha uma conta na sua aplicação. Eles querem entrar com o provedor de identidade que a empresa já usa. TsgcSAMLServiceProvider transforma sua aplicação em um provedor de serviços SAML 2.0 para Entra ID, Okta, AD FS, Google Workspace e Keycloak. O provedor de identidade cuida do login, sua aplicação recebe uma asserção, e a assinatura dessa asserção é validada antes mesmo de você ver um nome de usuário.

Login no Active Directory e LDAP

Para a aplicação que roda dentro da rede da empresa, os usuários já têm uma senha: a do Windows. TsgcLDAPClient verifica um nome de usuário e senha contra o Active Directory ou qualquer diretório LDAP, via LDAPS ou StartTLS, para que a senha nunca atravesse a rede em texto claro. Defina Security como ldapsecLDAPS ou ldapsecStartTLS e chame Authenticate.

Saber quem é o usuário responde só metade da pergunta. GetUserGroups retorna os grupos aos quais a conta pertence, incluindo grupos aninhados, para que “este usuário é um aprovador de faturas” seja uma única chamada em vez de uma busca recursiva que você mesmo precisa escrever e depurar.

Códigos de dois fatores de um aplicativo autenticador

TsgcTOTPAuthenticator gera e verifica os códigos de seis dígitos do Google Authenticator, Microsoft Authenticator e qualquer outro aplicativo TOTP. O cadastro consiste em um segredo e uma URI que você exibe como um código QR. O login é uma única chamada:

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;

Essa sobrecarga é a proteção contra repetição: um código que já foi aceito é recusado, mesmo dentro dos seus próprios trinta segundos, para que um código lido por cima do ombro de alguém não valha nada depois de usado. Para o dia em que o celular for perdido, GenerateRecoveryCodes preenche uma lista com códigos de recuperação de uso único. Guarde-os do jeito que você guarda senhas.

Login com OpenID Connect

TsgcHTTP_OIDC_Client autentica usuários com qualquer provedor OpenID Connect. Ele lê o documento de descoberta do provedor, para que a configuração seja uma URL de emissor e um ID de cliente em vez de uma lista de endpoints copiada à mão. Ele valida o token de ID recebido, e as mesmas chaves de assinatura validam os tokens de portador que chegam à sua própria API REST, incluindo tokens de aplicações multilocatárias do Entra ID, em que cada locatário de cliente assina com seu próprio emissor.

OAuth2 para o e-mail do Microsoft 365 e Gmail

O Microsoft 365 e o Gmail esperam OAuth2, não uma senha, de SMTP, IMAP e POP3. TsgcMailOAuth2 obtém o token de acesso, o renova e constrói a string XOAUTH2 com a qual sua sessão SMTP, IMAP ou POP3 faz login. Escolha o provedor e os protocolos, informe seu ID de cliente, e guarde o token de atualização quando OnTokensChanged disparar. Um serviço ou aplicativo de console sem navegador pode usar o fluxo de código de dispositivo.

Experimente as demos

Cada componente tem uma demo executável em Demos\26.Authentication:

Documentação

Onde conseguir

Os componentes estão incluídos nas edições Enterprise e All-Access do sgcWebSockets, para Delphi, C++ Builder e .NET. Se você só precisa de autenticação, o pacote sgcAuth os oferece separadamente. Eles são aditivos: nada muda em uma aplicação existente até você arrastar um deles para um formulário.

Leia também

Assista ao vídeo

Há um vídeo curto, “Delphi login with passkeys, SAML SSO, Active Directory LDAP and TOTP 2FA”, no canal da eSeGeCe.

Dúvidas, feedback ou ajuda para integrar isso à sua página de login? Entre em contato. Você receberá uma resposta das pessoas que escreveram o código.