Autoryzacja za pomocą zewnętrznych dostawców OAuth2

· Komponenty

Od wersji sgcWebSockets 2022.3.0 możesz używać zewnętrznych dostawców OAuth2 do uwierzytelniania żądań odbieranych przez twój serwer.

Komponent OAuth2 Server Provider pozwala zintegrować zewnętrznych dostawców OAuth2 (np. Azure AD, Google, Facebook...) z twoim komponentem serwera (np. serwerem HTTP), dzięki czemu użytkownik może zalogować się przy użyciu poświadczeń Azure AD, a jeśli uwierzytelnienie powiedzie się, serwer HTTP może udostępnić zasoby chronione.

Przebieg OAuth2 Server Provider 

Komponent OAuth2 Provider Server pozwala uwierzytelniać użytkownika u zewnętrznego dostawcy OAuth2 (np. Azure AD, Google...) w celu uzyskania dostępu do zasobów chronionych twojego serwera. Przykład: możesz skonfigurować serwer HTTP i pozwolić swoim użytkownikom logować się przy użyciu poświadczeń Azure, a po pomyślnym zalogowaniu udostępnić im zasoby chronione.

Proces uwierzytelniania odbywa się po stronie serwera, a tokeny OAuth2 nie są udostępniane klientom. Oznacza to, że gdy użytkownik loguje się na przykład przez Azure, w przypadku pomyślnego uwierzytelnienia Azure zwraca Access Token, którym można wysyłać żądania do serwera Azure w celu pobrania informacji (w zależności od zakresu) o profilu, e-mailach itp. Ten Access Token NIE JEST UDOSTĘPNIANY klientowi (np. przeglądarce internetowej). Zamiast zwracać Access Token klientowi, serwer tworzy losowy identyfikator, który wewnętrznie wiąże z Access Tokenem. Za każdym razem, gdy klient (przeglądarka) chce wykonać wywołanie do serwera OAuth2, używa publicznego identyfikatora, a serwer na jego podstawie odczytuje Access Token, aby proxować żądania HTTP.

Poniżej znajdziesz przykład działania uwierzytelniania OAuth2. Przykład korzysta z konfiguracji Azure AD opisanej pod linkiem OAuth2 Provider Azure AD.

Uruchom serwer

Serwer zaczyna nasłuchiwać na localhost i porcie 443. Serwer HTTP sgcWebSockets jest powiązany z komponentem OAuth2 Server Provider, a właściwość Authentication jest włączona.

Przed uruchomieniem serwera dostawca Azure OAuth2 zostaje zarejestrowany poniższym wywołaniem metody.

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

Użytkownik się loguje

Użytkownik otwiera nową przeglądarkę i wchodzi w endpoint '/login'.

Serwer wykrywa, że endpoint '/login' służy do logowania przez dostawcę Azure, więc przekierowuje na

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

I rozpoczyna się przepływ uwierzytelniania OAuth2.

Uwierzytelnianie OAuth2

Użytkownik zostaje przekierowany do endpointu uwierzytelniania serwera OAuth2 — musi zalogować się przy użyciu poświadczeń i zaakceptować warunki aplikacji OAuth2.

Jeśli autoryzacja przebiegnie pomyślnie, Azure AD wysyła kod na adres URL

https://localhost/callback

Walidacja kodu OAuth2

Serwer otrzymał kod z Azure i wykona wewnętrzne połączenie do Azure (z serwera do serwera), aby zweryfikować poprawność tokenu (i uniemożliwić próby włamania).

Serwer łączy się z

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

Przekazując parametry takie jak otrzymany kod i clientsecret. Jeśli walidacja przebiegnie pomyślnie, Azure zwraca Access Token, który można wykorzystać do dostępu do chronionych zasobów Azure, np. odczytu profilu, e-maila...

Pomyślne otrzymanie Access Tokenu

Gdy serwer otrzyma poprawny AccessToken, wywoływane jest zdarzenie OnOAuth2ProviderTokenValid — tutaj możesz skonfigurować, jak (i czy) AccessToken jest przechowywany, korzystając z klasy parametru TsgcHTTPOAuth2ProviderToken

AccesToken: token OAuth2 zwrócony przez Azure

ID: publiczny identyfikator przechowywany jako cookie.

W tym zdarzeniu możesz skonfigurować, co stanie się po pomyślnym uwierzytelnieniu, np. jeśli chcesz przekierować użytkownika do prywatnego adresu URL, użyj:

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

Wysyłanie żądań do Azure

Teraz możesz wysyłać żądania do serwera Azure, używając publicznego identyfikatora zapisanego jako cookie.

Przykład: aby odczytać dane profilu, użyj poniższej metody.

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

Gdzie ID to publiczny identyfikator.

Pobierz skompilowane demo OAuth2 Azure AD dla Windows