Autorização com Provedores OAuth2 Externos

· Componentes

A partir do sgcWebSockets 2022.3.0, você pode usar external OAuth2 Providers para Autenticar o Requests received por your server.

The Servidor OAuth2 Provider Component permite integrate External OAuth2 Providers (like Azure AD, Google, Facebook...) em your server component (like um HTP server), so um user can login using o Azure AD credentials e if o autenticação is bem-sucedido, o HTTP server can provide access para protected resources.

Servidor OAuth2 Provider Flow 

The OAuth2 Provider Server Component permite Autenticar using um External OAuth2 Provider (like Azure AD, Google...) para acessar o protected resources de your server. Exemplo: você pode configure your HTTP Server e allow login using o Azure Credentials para your uses, so if o login is bem-sucedido, você vai permitir enter para o protected resources de your server para these users.

The Autenticação process is done do servidor side e o OAuth2 tokens are not shared com o clients, isso significa that quando o user logins using Azure por exemplo, if o autenticação is bem-sucedido, Azure retorna um Token de acesso that allows para enviar requests para o Azure server para obter some information (depending do scope) sobre o user profile, emails... This Token de acesso IS NOT SHARED com o cliente (exemplo um web-browser), instead de returning o Access token para o cliente, o servidor creates um random ID that it's linked internally com o Token de acesso, so every time o Client (Web Browser) wants para do um call para o Servidor OAuth2, uses o public ID e o servidor uses this ID para obter o OAuth2 Token de acesso para proxy o HTTP Requests.

Veja abaixo um exemplo de como o OAuth2 Autenticação works. The exemplo will use o Azure AD configuração described em o link um seguir OAuth2 Provider Azure AD.

Iniciar o Server

O servidor starts escutando em localhost e port 443. The sgcWebSockets HTTP Server is linked para o Servidor OAuth2 Provider Component e o Autenticação property is enabled.

Before o servidor is started, o Azure OAuth2 Provider is registered usando o seguinte method call.

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

User Logins

The user opens um novo web browser e go para '/login' endpoint.

O servidor detects that o '/login' endpoint é usado para login using o Azure provider so redirects para

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

And o OAuth2 autenticação Flow Starts.

OAuth2 Autenticação

The user is redirected para o Servidor OAuth2 Autenticação Endpoint, now he must login using o credentials e accept o terms do OAuth2 Application.

If o autorização is bem-sucedido, Azure AD sends um Code para o url

https://localhost/callback

Validate o OAuth2 Code

Now, o servidor has received um code um partir de Azure e it will do um internal conexão para Azure (from server para server) para validate this token is correct (and avoid someone is tentando hack o servidor).

O servidor connects para

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

Passing some paramenters like o code received e o clientsecret, if o validation is bem-sucedido, Azure retorna o Token de acesso that pode ser usado para access o Azure Protected Resources like read o profile, email...

Bem-sucedido Token de acesso

When o servidor receives um success full AccessToken, o evento OnOAuth2ProviderTokenValid is chamado, so aqui você pode configure how o AccessToken is stored (if it is) accessing para o parâmetro class TsgcHTTPOAuth2ProviderToken

AccesToken: is o OAuth2 Token returned por Azure

ID: is o public identifier stored como um cookie.

In this event você pode configure what para do after um bem-sucedido autenticação, exemplo: se você quiser redirect o usuário para o private url, use o following

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

Send Requests para Azure

Now, você pode send requests para o Azure server using o Public ID stored como um cookie.

Exemplo: se você quiser read o profile data, use o following method.

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

Where ID is o public ID identifier.

Baixar demo compilado OAuth2 Azure AD para Windows