ユーザー プリンシパルへのアクセスを提供するには、 アプリケーションの接続 に関するセクションの手順が必要ですが、サービス プリンシパルを使用して GraphQL API にアクセスすることもできます。
アプリケーションを接続して Microsoft Entra アプリを作成する手順に従いますが、サービス プリンシパルにはスコープは必要ありません。 新しいアプリで、[証明書とシークレット] の下にクライアント シークレットを追加します。詳細については、「Microsoft Entra アプリを登録し、サービス プリンシパルを作成する」を参照してください。
テナント管理者が Fabric でサービス プリンシパルの使用を有効にしていることを確認します。 テナント管理ポータルで、[テナント設定] に進みます。 [開発者設定] で、[サービス プリンシパルは Fabric API を使用できる] セクションを有効にします。 この設定を有効にすると、ロールまたはアクセス許可の割り当てのためにアプリケーションが Fabric Portal に表示されます。 詳細については、「ID のサポート」を参照してください。
サービス プリンシパルは、GraphQL API とデータ ソースの両方にアクセスする必要があります。具体的には、GraphQL API に対する 実行 アクセス許可と、それに応じて選択したデータ ソースで必要な読み取りまたは書き込みアクセスが必要です。 Fabric Portal でワークスペースを開き、API の横にある省略記号を選択します。 API の [アクセス許可の管理]、次に [ユーザーの追加] の順に選択します。 アプリケーションを追加し、[ クエリとミューテーションの実行] を選択します。これは、サービス プリンシパルに必要な 実行 アクセス許可を提供します。 テスト目的で、API とデータ ソースの両方に必要なアクセス許可を実装する最も簡単な方法は、GraphQL API とデータ ソース項目の両方が配置されている共同作成者ロールを持つワークスペース メンバーとしてアプリケーションを追加することです。
サービス プリンシパルには証明書またはクライアント シークレットが必要であるため、前の手順で作成した React アプリのようなシングル ページ アプリケーション (SPA) では、Microsoft Authentication Library (MSAL) ではサポートされません。 要件とユース ケースに応じて、適切に定義された認可ロジックで適切にセキュリティ保護されたバックエンド サービスを利用できます。
サービス プリンシパルからアクセスされるように API が構成されたら、ローカル コンピューターでシンプルな Node.JS アプリケーションを使用してローカルでテストできます。
const { ClientSecretCredential } = require('@azure/identity');
// Define your Microsoft Entra ID credentials
const tenantId = "<YOUR_TENANT_ID>";
const clientId = "<YOUR_CLIENT_ID>";
const clientSecret = "<YOUR_CLIENT_SECRET>"; // Service principal secret value
const scope = "https://api.fabric.microsoft.com/.default"; // The scope of the token to access Fabric
// Create a credential object with service principal details
const credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
// Function to retrieve the token
async function getToken() {
try {
// Get the token for the specified scope
const tokenResponse = await credential.getToken(scope);
console.log("Access Token:", tokenResponse.token);
} catch (err) {
console.error("Error retrieving token:", err.message);
}
}
選択した Node.JS パッケージ マネージャーとの依存関係 (@azure/identity
) をインストールし、必要な情報でファイルを変更し、それを保存して実行 (node <filename.js>
) すると、Microsoft Entra からトークンを取得できるようになります。
その後、適切な詳細を、取得した トークン、実行したい GraphQL クエリ、GraphQL API エンドポイントに置き換えて、トークンを使用して、PowerShell で GraphQL API を呼び出すことができます。
$headers = @{
Authorization = "Bearer <YOUR_TOKEN>"
'Content-Type' = 'application/json'
}
$body = @{
query = @"
<YOUR_GRAPHQL_QUERY>
"@
}
# Make the POST request to the GraphQL API
$response = Invoke-RestMethod -Uri "<YOUR_GRAPHQL_API_ENDPOINT>" -Method POST -Headers $headers -Body ($body | ConvertTo-Json)
# Output the response
$response | ConvertTo-Json -Depth 10
または、cURL を使用して同じ結果を得ることもできます。
curl -X POST <YOUR_GRAPHQL_API_ENDPOINT> \
-H "Authorization: <YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"query": "<YOUR_GRAPHQL_QUERY(in a single line)>"}'
ローカル テストの目的で、Node.JS コードを追加の依存関係 (axios
) で少し変更してトークンを取得し、1 回の実行で API を呼び出すことができます。
const { ClientSecretCredential } = require('@azure/identity');
const axios = require('axios');
// Microsoft Entra ID credentials
const tenantId = "<YOUR_TENANT_ID>";
const clientId = "<YOUR_CLIENT_ID>";
const clientSecret = "<YOUR_CLIENT_SECRET>"; // Service principal secret value
// GraphQL API details
const graphqlApiUrl = "YOUR_GRAPHQL_API_ENDPOINT>";
const scope = "https://api.fabric.microsoft.com/.default"; // The scope to request the token for
// The GraphQL query
const graphqlQuery = {
query: `
<YOUR_GRAPHQL_QUERY>
`
};
// Function to retrieve a token and call the GraphQL API
async function fetchGraphQLData() {
try {
// Step 1: Retrieve token using the ClientSecretCredential
const credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
const tokenResponse = await credential.getToken(scope);
const accessToken = tokenResponse.token;
console.log("Access token retrieved!");
// Step 2: Use the token to make a POST request to the GraphQL API
const response = await axios.post(
graphqlApiUrl,
graphqlQuery,
{
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
}
}
);
// Step 3: Output the GraphQL response data
console.log("GraphQL API response:", JSON.stringify(response.data));
} catch (err) {
console.error("Error:", err.message);
}
}
// Execute the function
fetchGraphQLData();