Använd tjänstprincipaler med Fabric API för GraphQL

Följ stegen i avsnittet Anslut program för att ge åtkomst till användarprinciper. Du kan också komma åt GraphQL-API:et med tjänstens huvudnamn:

  1. Följ stegen i Ansluta program för att skapa en Microsoft Entra-app, men tänk på att omfång inte behövs för tjänstens huvudnamn. I den nya appen lägger du till en klienthemlighet under Certifikat och hemligheter. Mer information finns i Registrera en Microsoft Entra-app och skapa ett huvudnamn för tjänsten.

  2. Se till att klientadministratörer aktiverar användningen av tjänstens huvudinstanser i Fabric. Gå till Klientorganisationsinställningar i administrationsportalen för klientorganisationen. Under Inställningar för utvecklare kan tjänstens huvudnamn använda Infrastruktur-API:er. Med den här inställningen aktiverad visas programmet i Infrastrukturportalen för roll- eller behörighetstilldelning. Du hittar mer information om identitetsstöd.

  3. Tjänstens huvudprincip behöver åtkomst till både GraphQL-API:et och datakällan, mer specifikt Kör behörighet till GraphQL-API:et och läs- eller skrivbehörighet som krävs i den datakälla som du väljer beroende på behov. Öppna arbetsytan i Infrastrukturportalen och välj ellipsen bredvid API:et. Välj Hantera behörigheter för API:et och sedan Lägg till användare. Lägg till programmet och välj Kör frågor och förändringar, vilket ger nödvändiga Kör-behörigheter till tjänsthuvudnamn. I testsyfte är det enklaste sättet att implementera de behörigheter som krävs för både API:et och datakällan genom att lägga till programmet som medlem i arbetsytan med en deltagarroll där både GraphQL-API:et och datakällobjekten finns.

Skärmbild av GraphQL API-behörigheter.

Eftersom ett tjänstehuvudnamn kräver antingen ett certifikat eller en klienthemlighet stöds det inte av Microsoft Authentication Library (MSAL) i enkeltsideapplikationer (SPA) som React-appen vi byggde i det sista steget. Du kan använda en serverdelstjänst som är korrekt skyddad med väldefinierad auktoriseringslogik beroende på dina krav och användningsfall.

När api:et har konfigurerats för åtkomst av tjänstens huvudnamn kan du testa det lokalt med hjälp av ett enkelt Node.JS program på den lokala datorn:

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);
    }
}

Installera beroendena (@azure/identity) med valfri Node.js pakethanterare, ändra filen med nödvändig information, spara den och köra den (node <filename.js>). Detta hämtar en token från Microsoft Entra.

Token kan sedan användas för att anropa GraphQL-API:et med Hjälp av PowerShell genom att ersätta lämplig information med den token som du hämtade, Den GraphQL-fråga som du vill köra och GraphQL API-slutpunkten:

$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 

Du kan också använda cURL för att uppnå samma resultat:

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)>"}'

För lokal testning ändrar du Node.js koden något med ett extra beroende (axios) för att hämta token och anropa API:et i en enda körning:

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();