To zadanie jest kontynuacją rozszerzania aplikacji chatbot. Twoim zadaniem jest skonfigurowanie aplikacji do uwierzytelniania użytkowników za pomocą Entra ID (Azure AD). Bazowy kod aplikacji znajduje się w katalogu src
. Aplikacja wymaga konfiguracji do realizacji authorization code flow with PKCE (Proof Key for Code Exchange).
- Konfiguracja aplikacji w Entra ID (Azure AD).
- Dodanie Redirect URIs.
- Dodanie Application ID URI i skopu.
- Dodanie group claim.
- Dodanie uprawnień API.
- Zaloguj się do Azure Portal i przejdź do sekcji Azure Active Directory.
- Zarejestruj nową aplikację:
- Nazwa:
TwojaNazwaAplikacji
- Typ konta: Konta w katalogu organizacji
- URI przekierowania: Dodaj URI przekierowania, np.
http://localhost:5001
,https://*.app.github.dev
,https://<hostname Twojego appservice>
- Nazwa:
- Zapisz Application ID nowo utworzonej aplikacji i przekaż je jako zmienną do App Service o nazwie
CLIENT_ID
. - Zapisz ID Tenant (Tenant ID) Entra ID i przekaż je jako zmienną do App Service o nazwie
TENANT_ID
.
Dokumentacja:
- W sekcji
Uwierzytelnianie
aplikacji Entra ID (Azure AD) dodaj następujące adresy URL jako Redirect URIs w sekcji "Add a platform" -> Single-page application:http://localhost:5001
https://*.app.github.dev
https://<hostname Twojego appservice>
- W sekcji
Expose an API
dodaj Application ID URI. - Dodaj nowy scope:
- Nazwa:
chat
Who can consent?
:Admins and users
- Nazwa:
- W sekcji
Token configuration
dodaj group claim i zaznaczSecurity groups
. Na każdej grupie zaznacz opcjęEmit groups as role claims
.
- W sekcji
API permissions
dodaj uprawnienieUser.ReadBasic.All
z Microsoft Graph.
- Konfiguracja MSAL.js:
- Na początku kodu zdefiniowane jest
msalConfig
, które zawieraclientId
(identyfikator aplikacji),authority
(adres URL Tenant) orazredirectUri
(adres, na który użytkownik zostanie przekierowany po uwierzytelnieniu). msalInstance
jest instancjąmsal.PublicClientApplication
, która jest używana do interakcji z Entra ID (Azure AD).
- Na początku kodu zdefiniowane jest
Dokumentacja:
-
Żądanie logowania:
loginRequest
definiuje zakresy, które aplikacja będzie żądać, w tymuser.read
orazapi://clientId/chat
, które są potrzebne do uzyskania dostępu do API.
-
Inicjalizacja MSAL:
- Funkcja
initializeMsal
jest wywoływana, aby zainicjować MSAL. msalInstance.handleRedirectPromise
sprawdza, czy odpowiedź z przekierowania po uwierzytelnieniu jest dostępna i obsługuje ją za pomocąhandleResponse
.
- Funkcja
-
Logowanie i wylogowanie:
- Po kliknięciu przycisku login/logout
loginButton
odpowiednia funkcja (logowanie lub wylogowanie) jest wywoływana. msalInstance.loginPopup
uruchamia popup logowania, a po pomyślnym logowaniu wywołujehandleResponse
.
- Po kliknięciu przycisku login/logout
-
Uzyskiwanie tokenu i wysyłanie wiadomości:
- Po kliknięciu przycisku
sendButton
wysyłane jest zapytanie do API chatbota. msalInstance.acquireTokenSilent
używa istniejącej sesji do uzyskania tokenu dostępu.- Token dostępu jest używany w nagłówku
Authorization
przy wysyłaniu zapytania do backendu/chat
. - Odpowiedź od backendu jest wyświetlana w oknie czatu.
- Po kliknięciu przycisku
-
Wstrzykiwanie
clientId
itenantId
do frontendu:clientId
itenantId
są przekazywane do frontendu jako zmienne środowiskowe zdefiniowane w App Service i umieszczone w pliku JavaScript jako wartościclientId
itenantId
używane w konfiguracji MSAL.js.
<script>
const clientId = "{{ client_id }}";
const tenantId = "{{ tenant_id }}";
</script>
W pliku app.py
jest funkcja odpowiedzialna za wstrzykiwanie clientId
i tenantId
do frontendu:
@app.route('/')
def index():
client_id = os.getenv('CLIENT_ID')
tenant_id = os.getenv('TENANT_ID')
return render_template('index.html', client_id=client_id, tenant_id=tenant_id)
Ta funkcja pobiera wartości clientId
i tenantId
z zmiennych środowiskowych i przekazuje je do szablonu index.html
, gdzie są używane w konfiguracji MSAL.js.
-
Obsługa zapytań do chatbota:
- Backend nasłuchuje na endpointzie
/chat
. - Każde zapytanie jest uwierzytelniane za pomocą tokenu Bearer przesyłanego w nagłówku.
- Backend nasłuchuje na endpointzie
-
Weryfikacja tokenu:
- Backend weryfikuje token dostępu używając kodu z katalogu
helpers
. - Token jest dekodowany, a informacje w nim zawarte (takie jak identyfikator użytkownika i role) są używane do autoryzacji zapytania.
- Backend weryfikuje token dostępu używając kodu z katalogu
-
Przetwarzanie zapytania:
- Po pomyślnej weryfikacji tokenu backend przetwarza zapytanie użytkownika.
- Generowana jest odpowiedź przez model chatbota i zwracana do klienta.
-
Dekorator sprawdzający token:
- W kodzie backendu używany jest dekorator
@requires_jwt_authorization
, który korzysta z kodu w kataloguhelpers
do sprawdzenia tokenu dostępu w każdym zapytaniu. Ten dekorator zapewnia, że tylko uwierzytelnieni użytkownicy mogą uzyskać dostęp do endpointu/chat
.
- W kodzie backendu używany jest dekorator
Wykonując powyższe kroki, skonfigurujesz aplikację chatbota do uwierzytelniania użytkowników za pomocą Entra ID (Azure AD), używając authorization code flow with PKCE. Zapewni to bezpieczne i skalowalne uwierzytelnianie w Twojej aplikacji.
- Frontend używa MSAL.js do zarządzania sesjami użytkownika, logowania i uzyskiwania tokenów dostępu.
- Backend weryfikuje tokeny dostępu za pomocą dekoratora
@requires_jwt_authorization
, który korzysta z kodu w kataloguhelpers
, i autoryzuje zapytania, zapewniając, że tylko uwierzytelnieni użytkownicy mogą korzystać z API chatbota. - Proces uwierzytelniania i autoryzacji jest w pełni zintegrowany, co zapewnia bezpieczny dostęp do aplikacji chatbota.