O Componente Servidor de Provedor OAuth2 permite que você autentique usando um provedor OAuth2 externo (como Azure AD ou Google) para acessar os recursos protegidos do seu servidor. Exemplo: você pode configurar seu servidor HTTP para permitir que os usuários façam login usando credenciais Azure; se o login for bem-sucedido, esses usuários terão permissão para acessar os recursos protegidos do seu servidor.
O processo de autenticação é feito no lado do servidor e os tokens OAuth2 não são compartilhados com os clientes. Isso significa que quando o usuário faz login usando o Azure, por exemplo, se a autenticação for bem-sucedida, o Azure retorna um Access Token que permite enviar requisições ao servidor Azure para obter algumas informações (dependendo do scope) sobre o perfil do usuário, emails... Este Access Token NÃO É COMPARTILHADO com o cliente (por exemplo, um navegador web); em vez de retornar o Access Token ao cliente, o servidor cria um ID aleatório que é vinculado internamente ao Access Token, de modo que toda vez que o Cliente (Navegador Web) quiser fazer uma chamada ao servidor OAuth2, usa o ID público e o servidor usa este ID para obter o Access Token OAuth2 para fazer o proxy das requisições HTTP.
Veja abaixo um exemplo de como a Autenticação OAuth2 funciona. O exemplo utilizará a configuração do Azure AD descrita no link a seguir OAuth2 Provider Azure AD.
Inicie o Servidor
O servidor começa a escutar em localhost e na porta 443. O Servidor HTTP sgcWebSockets é vinculado ao Componente Servidor Provedor OAuth2 e a propriedade Authentication está habilitada.
Antes de o servidor ser iniciado, o Provedor OAuth2 da Azure é registrado utilizando a seguinte chamada 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'
);
Logins de usuário
O usuário abre um novo navegador web e vai para o endpoint '/login'.
O servidor detecta que o endpoint '/login' é usado para fazer login usando o provedor Azure, então redireciona para
https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/authorize
E o Fluxo de autenticação OAuth2 Inicia.
OAuth2 Authentication
O usuário é redirecionado ao Endpoint de Autenticação do Servidor OAuth2; agora ele deve fazer login usando as credenciais e aceitar os termos da Aplicação OAuth2.
Se a autorização for bem-sucedida, o Azure AD envia um Code para a url
https://localhost/callback
Validar o OAuth2 Code
Agora, o servidor recebeu um código do Azure e fará uma conexão interna ao Azure (de servidor a servidor) para validar se esse token está correto (e evitar que alguém tente invadir o servidor).
O servidor se conecta a
https://login.microsoftonline.com/a0ca2055-5dd1-467f-bf13-291f6fd715c6/oauth2/v2.0/token
Ao passar alguns parâmetros como o código recebido e o clientsecret, se a validação for bem-sucedida, o Azure retorna o Access Token que pode ser utilizado para acessar os Azure Protected Resources, como ler o perfil, e-mail...
Access Token Bem-Sucedido
Quando o servidor recebe um AccessToken bem-sucedido, o evento OnOAuth2ProviderTokenValid é chamado, portanto aqui você pode configurar como o AccessToken é armazenado (se for), acessando a classe de parâmetro TsgcHTTPOAuth2ProviderToken
AccesToken: é o Token OAuth2 retornado pelo Azure
ID: é o identificador público armazenado como um cookie.
Neste evento você pode configurar o que fazer após uma autenticação bem-sucedida, exemplo: se você quiser redirecionar o usuário para a url privada, utilize o seguinte
Response.Redirect.URL := 'https://localhost/private';
Enviar Requisições para a Azure
Agora, você pode enviar requisições ao servidor Azure usando o Public ID armazenado como um cookie.
Exemplo: se você quiser ler os dados do perfil, utilize o método a seguir.
Get('ID', 'https://graph.microsoft.com/v1.0/me');
Onde ID é o identificador de ID público.