使用服務主體在本機開發期間向 Azure 服務驗證 JavaScript 應用程式
當您建立雲端應用程式時,開發人員必須在其本機工作站上偵錯及測試應用程式。 當應用程式在本機開發期間於開發人員的工作站上執行時,仍必須向應用程式使用的任何 Azure 服務進行驗證。 本文說明如何設定在本機開發期間要使用的專用應用程式服務主體物件。
本機開發專用的應用程式服務主體可讓您遵循應用程式開發期間最低權限的準則。 由於權限的範圍會限定為開發期間應用程式所需的內容,因此應用程式之程式碼無法意外存取要供不同應用程式使用的 Azure 資源。 這個方法也會防止應用程式移至生產環境時發生 Bug,因為應用程式在開發環境中過度許可權。
在 Azure 中註冊應用程式時,會為應用程式設定應用程式服務主體。 為本機開發註冊應用程式時,建議您:
- 為每個在應用程式上作業的開發人員建立個別的應用程式註冊。 此方法會建立個別的應用程式服務主體,讓每個開發人員在本機開發期間使用,並避免開發人員需要共用單一應用程式服務主體的認證。
- 為每個應用程式建立個別的應用程式註冊。 這麼做會限制應用程式的權限,使之僅具備所需的權限。
在本機開發期間,會使用應用程式服務主體的身分識別來設定環境變數。 適用於 JavaScript 的 Azure SDK 會讀取這些環境變數,並使用這項資訊向所需的 Azure 資源驗證應用程式。
1:在 Azure 中註冊應用程式
系統會用於 Azure 註冊的應用程式建立應用程式服務主體物件。 您可以使用 Azure 入口網站 或 Azure CLI 來建立服務主體。
登入 Azure 入口網站並遵循下列步驟。
2 - 建立Microsoft專案安全組以進行本機開發
由於通常有多個開發人員在應用程式上工作,因此建議建立Microsoft Entra 群組來封裝應用程式在本機開發中所需的角色(許可權),而不是將角色指派給個別服務主體物件。 這具有以下優點。
- 由於角色是在群組層級指派,因此指派給每位開發人員的角色都能保證相同。
- 如果應用程式需要新的角色,則只需要將它新增至應用程式的 Microsoft Entra 群組。
- 如有新開發人員加入小組,則系統會為其建立新的應用程式服務主體並新增至群組,確定開發人員具備處理應用程式的適當權限。
3:為應用程式指派角色
接著,您必須決定應用程式針對哪些資源需要哪些角色 (權限),並將這些角色指派給應用程式。 在此範例中,角色會指派給步驟 2 中建立的 Microsoft Entra 群組。 角色可在資源、資源群組或訂閱範圍內獲派其他角色。 此範例示範如何在資源群組範圍中指派角色,因為大部分的應用程式都會將其所有 Azure 資源群組組成單一資源群組。
4 - 設定本機開發環境變數
物件 DefaultAzureCredential
會在運行時間的一組環境變數中尋找服務主體資訊。 由於大部分開發人員都處理多個應用程式,因此建議使用 dotenv 之類的套件,從.env
應用程式目錄中儲存的檔案在開發期間存取環境。 這會限定用來向 Azure 驗證應用程式的環境變數,讓它們只能供此應用程式使用。
檔案 .env
永遠不會簽入原始檔控制,因為它包含 Azure 的應用程式秘密密鑰。 JavaScript 的標準 .gitignore 檔案會自動從簽入中排除 .env
檔案。
若要使用 dotenv
套件,請先在應用程式中安裝套件。
npm install dotenv
然後,在應用程式根目錄中建立 .env
檔案。 使用從應用程式註冊程式取得的值來設定環境變數值,如下所示:
AZURE_CLIENT_ID
→ 應用程式識別碼的值。AZURE_TENANT_ID
→ 租用戶識別碼的值。AZURE_CLIENT_SECRET
→ 為應用程式產生的密碼/認證。
AZURE_CLIENT_ID=00001111-aaaa-2222-bbbb-3333cccc4444
AZURE_TENANT_ID=ffffaaaa-5555-bbbb-6666-cccc7777dddd
AZURE_CLIENT_SECRET=Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2
最後,在應用程式的啟動程式代碼中,使用連結 dotenv
庫從啟動時從 .env
檔案讀取環境變數。
import 'dotenv/config'
5:在應用程式中實作 DefaultAzureCredential
若要向 Azure 驗證 Azure SDK 用戶端物件,您的應用程式應該使用 DefaultAzureCredential
套件中的 @azure/identity
類別。 在此案例中, DefaultAzureCredential
會偵測環境變數 AZURE_CLIENT_ID
、 AZURE_TENANT_ID
和 AZURE_CLIENT_SECRET
已設定並讀取這些變數,以取得要連線到 Azure 的應用程式服務主體資訊。
首先,將 @azure/身分 識別套件新增至您的應用程式。
npm install @azure/identity
接下來,針對在應用程式中建立 Azure SDK 用戶端物件的任何 JavaScript 程式代碼,您會想要:
- 從模組匯入
DefaultAzureCredential
@azure/identity
類別。 - 建立
DefaultAzureCredential
物件。 - 將
DefaultAzureCredential
對象傳遞至 Azure SDK 用戶端物件建構函式。
下列程式碼區段示範其中一種範例。
// 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
會自動偵測為應用程式設定的驗證機制,並取得向 Azure 驗證應用程式所需的令牌。 如果應用程式使用多個SDK用戶端,則相同的認證物件可以與每個SDK客戶端物件搭配使用。