Uwierzytelnianie aplikacji JavaScript w usługach platformy Azure podczas programowania lokalnego przy użyciu jednostek usługi
Artykuł
Podczas tworzenia aplikacji w chmurze deweloperzy muszą debugować i testować aplikacje na lokalnej stacji roboczej. Gdy aplikacja jest uruchamiana na stacji roboczej dewelopera podczas programowania lokalnego, nadal musi uwierzytelniać się w dowolnych usługach platformy Azure używanych przez aplikację. W tym artykule opisano sposób konfigurowania dedykowanych obiektów jednostki usługi aplikacji, które mają być używane podczas programowania lokalnego.
Dedykowane jednostki usługi aplikacji na potrzeby tworzenia aplikacji lokalnych umożliwiają przestrzeganie zasady najniższych uprawnień podczas tworzenia aplikacji. Ponieważ uprawnienia są ograniczone do dokładnie tego, co jest potrzebne dla aplikacji podczas programowania, kod aplikacji nie może przypadkowo uzyskać dostępu do zasobu platformy Azure przeznaczonego do użytku przez inną aplikację. Ta metoda uniemożliwia również występowanie usterek podczas przenoszenia aplikacji do środowiska produkcyjnego, ponieważ aplikacja została nadmiernie uprzywilejowana w środowisku deweloperskim.
Jednostka usługi aplikacji jest skonfigurowana dla aplikacji, gdy aplikacja jest zarejestrowana na platformie Azure. Podczas rejestrowania aplikacji na potrzeby programowania lokalnego zaleca się:
Utwórz oddzielne rejestracje aplikacji dla każdego dewelopera pracującego nad aplikacją. Ta metoda tworzy oddzielne jednostki usługi aplikacji dla każdego dewelopera do użycia podczas programowania lokalnego i uniknąć konieczności, aby deweloperzy współużytkowali poświadczenia dla pojedynczej jednostki usługi aplikacji.
Utwórz oddzielne rejestracje aplikacji na aplikację. Obejmuje to uprawnienia aplikacji tylko do tego, co jest potrzebne przez aplikację.
Podczas programowania lokalnego zmienne środowiskowe są ustawiane przy użyciu tożsamości jednostki usługi aplikacji. Zestaw Azure SDK dla języka JavaScript odczytuje te zmienne środowiskowe i używa tych informacji do uwierzytelniania aplikacji w potrzebnych zasobach platformy Azure.
1 — Rejestrowanie aplikacji na platformie Azure
Obiekty jednostki usługi aplikacji są tworzone przy użyciu rejestracji aplikacji na platformie Azure. Jednostki usługi można tworzyć przy użyciu witryny Azure Portal lub interfejsu wiersza polecenia platformy Azure.
Zaloguj się do witryny Azure Portal i wykonaj następujące kroki.
Instrukcje
Zrzut ekranu
W witrynie Azure Portal:
Wprowadź rejestracje aplikacji na pasku wyszukiwania w górnej części witryny Azure Portal.
Wybierz element z etykietą Rejestracje aplikacji w obszarze nagłówka Usługi w menu wyświetlanym poniżej paska wyszukiwania.
Na stronie Rejestracje aplikacji wybierz pozycję + Nowa rejestracja.
Na stronie Rejestrowanie aplikacji wypełnij formularz w następujący sposób.
Nazwa → wprowadź nazwę rejestracji aplikacji na platformie Azure. Zaleca się, aby ta nazwa zawierała nazwę aplikacji, dla użytkownika, dla których jest rejestracja aplikacji, a identyfikator taki jak "dev", aby wskazać, że ta rejestracja aplikacji jest używana w programowania lokalnego.
Obsługiwane typy kont → Konta tylko w tym katalogu organizacyjnym.
Wybierz pozycję Zarejestruj, aby zarejestrować aplikację i utworzyć jednostkę usługi aplikacji.
Na stronie Rejestracja aplikacji dla aplikacji:
Identyfikator aplikacji (klienta) → Jest to identyfikator aplikacji, który będzie używany do uzyskiwania dostępu do platformy Azure podczas programowania lokalnego. Skopiuj tę wartość do lokalizacji tymczasowej w edytorze tekstów, ponieważ będzie ona potrzebna w przyszłym kroku.
Identyfikator katalogu (dzierżawy) → Ta wartość będzie również potrzebna przez aplikację podczas uwierzytelniania na platformie Azure. Skopiuj tę wartość do lokalizacji tymczasowej w edytorze tekstów, która będzie również potrzebna w przyszłym kroku.
Poświadczenia klienta → Należy ustawić poświadczenia klienta dla aplikacji, zanim aplikacja będzie mogła uwierzytelnić się na platformie Azure i korzystać z usług platformy Azure. Wybierz pozycję Dodaj certyfikat lub wpis tajny , aby dodać poświadczenia dla aplikacji.
Na stronie Certyfikaty i wpisy tajne wybierz pozycję + Nowy klucz tajny klienta.
W oknie dialogowym Dodawanie wpisu tajnego klienta zostanie wyświetlone okno dialogowe po prawej stronie. W tym oknie dialogowym:
Opis → Wprowadź wartość Current.
Wygasa → wybierz wartość 24 miesięcy.
Wybierz pozycję Dodaj , aby dodać wpis tajny.
Na stronie Certyfikaty i wpisy tajne zostanie wyświetlona wartość klucza tajnego klienta.
Skopiuj tę wartość do lokalizacji tymczasowej w edytorze tekstów, ponieważ będzie ona potrzebna w przyszłym kroku.
WAŻNE: jest to jedyna godzina wyświetlenia tej wartości. Po opuszczeniu lub odświeżeniu tej strony nie będzie można ponownie wyświetlić tej wartości. Możesz dodać więcej wpisów tajnych klienta bez unieważnienia tego wpisu tajnego klienta, ale ta wartość nie zostanie ponownie wyświetlona.
Polecenia interfejsu wiersza polecenia platformy Azure można uruchamiać w usłudze Azure Cloud Shell lub na stacji roboczej z zainstalowanym interfejsem wiersza polecenia platformy Azure.
Najpierw użyj polecenia az ad sp create-for-rbac , aby utworzyć nową jednostkę usługi dla aplikacji. Spowoduje to utworzenie rejestracji aplikacji dla aplikacji w tym samym czasie.
az ad sp create-for-rbac --name {service-principal-name}
Dane wyjściowe tego polecenia wyglądają podobnie do następującego obiektu JSON. Zaleca się skopiowanie tych danych wyjściowych do pliku tymczasowego w edytorze tekstów, ponieważ te wartości będą potrzebne w przyszłym kroku, ponieważ jest to jedyne miejsce, w którym kiedykolwiek zobaczysz klucz tajny klienta (hasło) dla jednostki usługi. Możesz jednak dodać nowe hasło później bez unieważnienia jednostki usługi lub istniejących haseł, jeśli jest to konieczne.
2 — Tworzenie grupy zabezpieczeń entra firmy Microsoft na potrzeby programowania lokalnego
Ponieważ zazwyczaj wielu deweloperów, którzy pracują nad aplikacją, zaleca się utworzenie grupy Entra firmy Microsoft w celu hermetyzacji ról (uprawnień) wymaganych przez aplikację w środowisku lokalnym zamiast przypisywania ról do poszczególnych obiektów jednostki usługi. Oferuje to następujące korzyści.
Każdy deweloper ma przypisane te same role, ponieważ role są przypisywane na poziomie grupy.
Jeśli dla aplikacji jest potrzebna nowa rola, należy ją dodać tylko do grupy Microsoft Entra dla aplikacji.
Jeśli nowy deweloper dołączy do zespołu, zostanie utworzona nowa jednostka usługi aplikacji dla dewelopera i dodana do grupy, zapewniając deweloperowi odpowiednie uprawnienia do pracy nad aplikacją.
Przejdź do strony Microsoft Entra ID w witrynie Azure Portal, wpisując ciąg Microsoft Entra ID w polu wyszukiwania w górnej części strony, a następnie wybierając pozycję Microsoft Entra ID w obszarze usług.
Na stronie Microsoft Entra ID wybierz pozycję Grupy z menu po lewej stronie.
Na stronie Wszystkie grupy wybierz pozycję Nowa grupa.
Na stronie Nowa grupa:
Typ grupy → Zabezpieczenia
Nazwa grupy → nazwa grupy zabezpieczeń, zazwyczaj utworzona na podstawie nazwy aplikacji. Warto również uwzględnić ciąg, taki jak local-dev w nazwie grupy, aby wskazać cel grupy.
Opis grupy → Opis celu grupy.
Wybierz link Brak wybranych członków w obszarze Członkowie, aby dodać członków do grupy.
W oknie dialogowym Dodawanie członków:
Użyj pola wyszukiwania, aby filtrować listę głównych nazw na liście.
Wybierz jednostki usługi aplikacji dla programowania lokalnego dla tej aplikacji. Po wybraniu obiektów będą wyszarzone i przeniesione do listy Wybrane elementy w dolnej części okna dialogowego.
Po zakończeniu wybierz przycisk Wybierz .
Po powrocie na stronę Nowa grupa wybierz pozycję Utwórz , aby utworzyć grupę.
Grupa zostanie utworzona i nastąpi powrót do strony Wszystkie grupy . Wyświetlenie grupy może potrwać do 30 sekund i może być konieczne odświeżenie strony z powodu buforowania w witrynie Azure Portal.
Polecenie az ad group create służy do tworzenia grup w usłudze Microsoft Entra ID. Parametry --display-name i --main-nickname są wymagane. Nazwa nadana grupie powinna być oparta na nazwie aplikacji. Warto również uwzględnić frazę taką jak "local-dev" w nazwie grupy, aby wskazać cel grupy.
az ad group create \
--display-name MyDisplay \
--mail-nickname MyDisplay \
--description \<group-description>
Aby dodać członków do grupy, potrzebny będzie identyfikator obiektu jednostki usługi aplikacji, który różni się od identyfikatora aplikacji. Użyj listy az ad sp, aby wyświetlić listę dostępnych jednostek usługi. Polecenie --filter parametru akceptuje filtry stylu OData i może służyć do filtrowania listy, jak pokazano. Parametr --query ogranicza kolumny tylko do tych, które cię interesują.
az ad sp list \
--filter "startswith(displayName, 'msdocs')" \
--query "[].{objectId:objectId, displayName:displayName}" \
--output table
az ad group member add \
--group \<group-name> \
--member-id \<object-id> \
3 — Przypisywanie ról do aplikacji
Następnie należy określić, jakich ról (uprawnień) potrzebuje twoja aplikacja na temat zasobów i przypisać te role do aplikacji. W tym przykładzie role są przypisywane do grupy Microsoft Entra utworzonej w kroku 2. Role mogą być przypisywane do roli w zakresie zasobu, grupy zasobów lub subskrypcji. W tym przykładzie pokazano, jak przypisywać role w zakresie grupy zasobów, ponieważ większość aplikacji grupuje wszystkie zasoby platformy Azure w jedną grupę zasobów.
Znajdź grupę zasobów dla aplikacji, wyszukując nazwę grupy zasobów przy użyciu pola wyszukiwania w górnej części witryny Azure Portal.
Przejdź do grupy zasobów, wybierając nazwę grupy zasobów pod nagłówkiem Grupy zasobów w oknie dialogowym.
Na stronie grupy zasobów wybierz pozycję Kontrola dostępu (Zarządzanie dostępem i tożsamościami) z menu po lewej stronie.
Na stronie Kontrola dostępu (Zarządzanie dostępem i tożsamościami):
Wybierz kartę Przypisania roli.
Wybierz pozycję + Dodaj z górnego menu, a następnie pozycję Dodaj przypisanie roli z wyświetlonego menu rozwijanego.
Strona Dodawanie przypisania roli zawiera listę wszystkich ról, które można przypisać dla grupy zasobów.
Użyj pola wyszukiwania, aby przefiltrować listę do bardziej możliwego do zarządzania rozmiaru. W tym przykładzie pokazano, jak filtrować role obiektów blob usługi Storage.
Wybierz rolę, którą chcesz przypisać.
Wybierz przycisk Dalej , aby przejść do następnego ekranu.
Następna strona Dodawanie przypisania roli umożliwia określenie, do którego użytkownika ma zostać przypisana rola.
Wybierz pozycję Użytkownik, grupa lub jednostka usługi w obszarze Przypisz dostęp do.
Wybierz pozycję + Wybierz członków w obszarze Członkowie
Zostanie otwarte okno dialogowe po prawej stronie witryny Azure Portal.
W oknie dialogowym Wybieranie członków:
Pole tekstowe Wybierz może służyć do filtrowania listy użytkowników i grup w ramach subskrypcji. W razie potrzeby wpisz kilka pierwszych znaków lokalnej grupy deweloperów firmy Microsoft Entra utworzonej dla aplikacji.
Wybierz lokalną grupę deweloperów firmy Microsoft skojarzona z twoją aplikacją.
Wybierz pozycję Wybierz w dolnej części okna dialogowego, aby kontynuować.
Grupa Microsoft Entra jest wyświetlana jako wybrana na ekranie Dodawanie przypisania roli.
Wybierz pozycję Przejrzyj i przypisz , aby przejść do ostatniej strony, a następnie ponownie przejrzyj i przypisz, aby ukończyć proces.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Aby na przykład umożliwić jednostce usługi aplikacji odczytywanie, zapisywanie i usuwanie dostępu do kontenerów obiektów blob usługi Azure Storage i danych do wszystkich kont magazynu w grupie zasobów msdocs-sdk-auth-example , należy przypisać jednostkę usługi aplikacji do roli Współautor danych obiektu blob usługi Storage przy użyciu następującego polecenia.
az role assignment create --assignee "aaaaaaaa-bbbb-cccc-7777-888888888888" \
--scope /subscriptions/"Storage Blob Data Subscriber" \
--role "Storage Blob Data Contributor" \
--resource-group "msdocs-sdk-auth-example"
4 — Ustawianie lokalnych zmiennych środowiskowych programowania
Obiekt DefaultAzureCredential szuka informacji o jednostce usługi w zestawie zmiennych środowiskowych w czasie wykonywania. Ponieważ większość deweloperów pracuje nad wieloma aplikacjami, zaleca się użycie pakietu takiego jak dotenv w celu uzyskania dostępu do środowiska z pliku przechowywanego .env w katalogu aplikacji podczas programowania. Obejmuje to zmienne środowiskowe używane do uwierzytelniania aplikacji na platformie Azure, tak aby mogły być używane tylko przez tę aplikację.
Plik .env nigdy nie jest ewidencjony w kontroli źródła, ponieważ zawiera klucz tajny aplikacji dla platformy Azure. Standardowy plik .gitignore dla języka JavaScript automatycznie wyklucza .env plik z ewidencjonowania.
Aby użyć dotenv pakietu, najpierw zainstaluj pakiet w aplikacji.
npm install dotenv
Następnie utwórz .env plik w katalogu głównym aplikacji. Ustaw wartości zmiennych środowiskowych z wartościami uzyskanymi z procesu rejestracji aplikacji w następujący sposób:
AZURE_CLIENT_ID → wartość identyfikatora aplikacji.
AZURE_TENANT_ID → wartość identyfikatora dzierżawy.
AZURE_CLIENT_SECRET → hasło/poświadczenia wygenerowane dla aplikacji.
Na koniec w kodzie uruchamiania aplikacji użyj dotenv biblioteki, aby odczytać zmienne środowiskowe z pliku podczas uruchamiania .env .
import 'dotenv/config'
5 — Implementowanie wartości domyślnejAzureCredential w aplikacji
Aby uwierzytelnić obiekty klienta zestawu Azure SDK na platformie Azure, aplikacja powinna używać DefaultAzureCredential klasy z @azure/identity pakietu. W tym scenariuszu wykrywa zmienne AZURE_CLIENT_IDśrodowiskowe , AZURE_TENANT_IDi AZURE_CLIENT_SECRET są ustawione i odczytuje te zmienne, DefaultAzureCredential aby uzyskać informacje o jednostce usługi aplikacji w celu nawiązania połączenia z platformą Azure za pomocą.
Następnie w przypadku dowolnego kodu JavaScript, który tworzy obiekt klienta zestawu Azure SDK w aplikacji, należy wykonać następujące czynności:
Zaimportuj klasę DefaultAzureCredential z modułu @azure/identity .
Utwórz DefaultAzureCredential obiekt.
Przekaż obiekt do konstruktora DefaultAzureCredential obiektu klienta zestawu Azure SDK.
Przykład jest pokazany w następującym segmencie kodu.
// Azure authentication dependency
import { DefaultAzureCredential } from '@azure/identity';
// Azure resource management dependency
import { SubscriptionClient } from "@azure/arm-subscriptions";
// Acquire credential
const tokenCredential = new DefaultAzureCredential();
async function listSubscriptions() {
try {
// use credential to authenticate with Azure SDKs
const client = new SubscriptionClient(tokenCredential);
// get details of each subscription
for await (const item of client.subscriptions.list()) {
const subscriptionDetails = await client.subscriptions.get(
item.subscriptionId
);
/*
Each item looks like:
{
id: '/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e',
subscriptionId: 'aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e',
displayName: 'YOUR-SUBSCRIPTION-NAME',
state: 'Enabled',
subscriptionPolicies: {
locationPlacementId: 'Internal_2014-09-01',
quotaId: 'Internal_2014-09-01',
spendingLimit: 'Off'
},
authorizationSource: 'RoleBased'
},
*/
console.log(subscriptionDetails);
}
} catch (err) {
console.error(JSON.stringify(err));
}
}
listSubscriptions()
.then(() => {
console.log("done");
})
.catch((ex) => {
console.log(ex);
});
DefaultAzureCredential Automatycznie wykryje mechanizm uwierzytelniania skonfigurowany dla aplikacji i uzyska niezbędne tokeny do uwierzytelniania aplikacji na platformie Azure. Jeśli aplikacja korzysta z więcej niż jednego klienta zestawu SDK, ten sam obiekt poświadczeń może być używany z każdym obiektem klienta zestawu SDK.