Поделиться через


Использование служебных принципов доступа с API Fabric для GraphQL

Выполните действия, описанные в разделе "Подключение приложений" , чтобы предоставить доступ к субъектам-пользователям. Вы также можете получить доступ к API GraphQL с помощью субъекта-службы:

  1. Выполните действия, описанные в разделе "Подключение приложений ", чтобы создать приложение Microsoft Entra, но помните, что области не нужны для субъектов-служб. В новом приложении добавьте секрет клиента в разделе "Сертификаты и секреты". Дополнительные сведения см. в разделе "Регистрация приложения Microsoft Entra" и создание субъекта-службы.

  2. Убедитесь, что администраторы клиентов позволяют использовать субъекты-службы в Fabric. На портале администрирования клиента перейдите к параметрам клиента. В разделе "Параметры разработчика" субъекты-службымогут использовать API Fabric. Если этот параметр включен, приложение отображается на портале Fabric для назначения ролей или разрешений. Дополнительные сведения о поддержке удостоверений можно найти.

  3. Субъект-служба должен иметь доступ как к API GraphQL, так и к источнику данных, в частности, разрешение на выполнение API GraphQL и доступ на чтение или запись, необходимый в выбранном источнике данных соответствующим образом. На портале Fabric откройте рабочую область и выберите многоточие рядом с API. Выберите " Управление разрешениями " для API, а затем "Добавить пользователя". Добавьте приложение и выберите команду "Выполнить запросы и мутации", которая предоставляет необходимые разрешения на выполнение для субъекта-службы. Для тестирования самый простой способ реализовать необходимые разрешения для API и источника данных — добавить приложение в качестве члена рабочей области с ролью участника, где находятся api GraphQL и элементы источника данных.

Снимок экрана: разрешения API GraphQL.

Так как субъект-служба требует сертификата или секрета клиента, он не поддерживается библиотекой проверки подлинности Майкрософт (MSAL) в одностраничных приложениях (SPAs), таких как приложение React, встроенное на последнем шаге. Вы можете использовать серверную службу правильно защищенной с четко определенной логикой авторизации в зависимости от ваших требований и вариантов использования.

После настройки доступа к 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);
    }
}

Установите зависимости (@azure/identity) с выбранным диспетчером пакетов Node.js, измените файл с требуемыми сведениями, сохраните его и выполните (node <filename.js>). Получает маркер из Microsoft Entra.

Затем маркер можно использовать для вызова API GraphQL с помощью PowerShell, заменив соответствующие сведения извлеченным маркером , запрос GraphQL , который требуется выполнить, и конечную точку API GraphQL:

$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), чтобы получить маркер и вызвать 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();