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.
