Подключение приложений к API Fabric для GraphQL
Примечание.
API Microsoft Fabric для GraphQL находится в предварительной версии.
Чтобы подключить приложение к API для GraphQL, вам потребуется три важных фрагмента информации: идентификатор клиента, идентификатор клиента и адрес конечной точки GraphQL в Fabric. В следующих разделах показано, как создать и получить все необходимые сведения и как получить доступ к API с помощью примера приложения.
Необходимые компоненты
В настоящее время API для GraphQL требует, чтобы приложения использовали Microsoft Entra для проверки подлинности. Приложение должно быть зарегистрировано и настроено надлежащим образом для выполнения вызовов API к Fabric. Дополнительные сведения см. в статье "Создание приложения Microsoft Entra" в Azure.
Прошедший проверку подлинности пользователь, вызывающий API, должен быть членом рабочей области, в которой находятся элементы API и источника данных с ролью участника. Дополнительные сведения см. в разделе "Предоставление пользователям доступа к рабочим областям".
Перед подключением приложения необходимо иметь API для GraphQL в Fabric. Дополнительные сведения см. в статье "Создание API для GraphQL в Fabric" и добавление данных.
Создание приложения Microsoft Entra
В следующих шагах показано, как настроить поддержку приложения ReactJS в Microsoft Entra.
Войдите на портал Azure.
Найдите и выберите Microsoft Entra ID.
В списке "Управление" выберите "Регистрация приложения".
Выберите Создать регистрацию.
Заполните необходимые сведения:
Имя — введите имя приложения.
Поддерживаемые типы учетных записей— выберите учетные записи, которые требуется поддерживать приложение.
(Необязательно) Универсальный код ресурса (URI перенаправления) — при необходимости введите универсальный код ресурса (URI). GraphQL.Execute.All или Item.Execute.All
Выберите Зарегистрировать. Значения идентификатора приложения приложения Microsoft Entra (клиента) и каталога (клиента) отображаются в поле сводки. Запишите эти значения, так как они требуются позже.
В списке "Управление" выберите разрешения API, а затем добавьте разрешение.
Добавьте службу PowerBI, выберите делегированные разрешения и выберите разрешения Datamart.ReadWrite.All. Убедитесь, что согласие администратора не требуется.
Вернитесь в список "Управление ", выберите "Проверка подлинности", выберите " Добавить платформу", а затем выберите одностраничные приложения.
Для локальных целей разработки добавьте
http://localhost:3000
в URI перенаправления и убедитесь, что приложение включено для потока кода авторизации с ключом проверки подлинности для Exchange кода (PKCE). Нажмите кнопку "Настройка", чтобы сохранить изменения. Если приложение получает ошибку, связанную с запросами между источниками, добавьте платформу мобильных и классических приложений на предыдущем шаге с тем же URI перенаправления.Вернитесь к авторизации, прокрутите вниз до дополнительных параметров и в разделе "Разрешить потоки общедоступных клиентов" выберите "Да" для включения следующих мобильных и классических потоков.
Настройка примера API GraphQL для доступа к приложениям
В этом примере мы создадим API GraphQL для предоставления примеров данных Lakehouse клиентам.
На домашней странице портала Fabric выберите Инжиниринг данных из списка рабочих нагрузок.
В интерфейсе Инжиниринг данных выберите "Использовать пример" и в разделе Lakehouse выберите общедоступные праздники, чтобы автоматически создать новый Lakehouse с данными о государственных праздниках.
Следуя инструкциям из статьи "Создание API для GraphQL", создайте новый API GraphQL и выберите созданное приложение Lakehouse. Добавьте таблицу государственных праздников, чтобы клиенты получают доступ к этим данным.
Проверьте API GraphQL в редакторе API с помощью следующего примера запроса. Это тот же запрос, который мы используем в клиентском приложении React:
query { publicholidays (filter: {countryRegionCode: {eq:"US"}, date: {gte: "2024-01-01T00:00:00.000Z", lte: "2024-12-31T00:00:00.000Z"}}) { items { countryOrRegion holidayName date } } }
Выберите конечную точку копирования на панели инструментов элемента API.
На экране ссылки "Копировать" нажмите кнопку "Копировать".
В качестве идентификатора клиента и идентификатора клиента из приложения Microsoft Entra, записанного ранее, скопируйте URI конечной точки по мере необходимости позже.
Настройка приложения React для доступа к API общедоступных праздников
Мы используем существующее приложение React в качестве отправной точки. Выполните все действия, описанные в руководстве по созданию одностраничного приложения React, и подготовьте его к проверке подлинности для создания проекта React с проверкой подлинности Microsoft Entra, включая дополнительные файлы и папки, необходимые для добавления в структуру проекта. Нам нужно изменить только три файла, чтобы адаптировать приложение для нашего варианта использования GraphQL.
В папке src откройте файл authConfig.js и замените содержимое файла следующим фрагментом кода:
/* * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. */ import { LogLevel } from "@azure/msal-browser"; /** * Configuration object to be passed to MSAL instance on creation. * For a full list of MSAL.js configuration parameters, visit: * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/configuration.md */ export const graphqlConfig = { graphqlEndpoint: "`Enter_the_GraphQL_Endpoint_Here" }; export const msalConfig = { auth: { clientId: "Enter_the_Application_Id_Here", authority: "https://login.microsoftonline.com/Enter_the_Tenant_Info_Here", redirectUri: "http://localhost:3000", }, cache: { cacheLocation: "sessionStorage", // This configures where your cache will be stored storeAuthStateInCookie: false, // Set this to "true" if you are having issues on IE11 or Edge }, system: { loggerOptions: { loggerCallback: (level, message, containsPii) => { if (containsPii) { return; } switch (level) { case LogLevel.Error: console.error(message); return; case LogLevel.Info: console.info(message); return; case LogLevel.Verbose: console.debug(message); return; case LogLevel.Warning: console.warn(message); return; default: return; } } } } }; /** * Scopes you add here will be prompted for user consent during sign-in. * By default, MSAL.js will add OIDC scopes (openid, profile, email) to any login request. * For more information about OIDC scopes, visit: * https://docs.microsoft.com/azure/active-directory/develop/v2-permissions-and-consent#openid-connect-scopes */ export const loginRequest = { scopes: ["https://analysis.windows.net/powerbi/api/Item.Execute.All","https://analysis.windows.net/powerbi/api/Datamart.ReadWrite.All"] }; /** * Add here the scopes to request when obtaining an access token for MS Graph API. For more information, see: * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/resources-and-scopes.md */ export const graphConfig = { graphMeEndpoint: "https://graph.microsoft.com/v1.0/me", };
Как видно из приведенного выше кода, важно использовать правильную область для доступа к приложению. В нашем случае
https://analysis.windows.net/powerbi/api/Item.Execute.All
иhttps://analysis.windows.net/powerbi/api/Datamart.ReadWrite.All
.Внимание
Области могут изменяться во время предварительной версии API Microsoft Fabric для GraphQL.
Замените следующие значения значениями из Центра администрирования Microsoft Entra.
clientId
— идентификатор приложения, который также называется клиентом. ЗаменитеEnter_the_Application_Id_Here
значение идентификатора приложения (клиента), записанное ранее на странице обзора зарегистрированного приложения Microsoft Entra.authority
— Это состоит из двух частей:- Экземпляр — конечная точка поставщика облачных служб. Ознакомьтесь с различными доступными конечными точками в национальных облаках.
- Идентификатор клиента — это идентификатор клиента, в котором зарегистрировано приложение. Замените Enter_the_Tenant_Info_Here значением идентификатора каталога (клиента), записанного ранее на странице обзора зарегистрированного приложения.
graphQLEndpoint
— API Fabric для конечной точки GraphQL. ЗаменитеEnter_the_GraphQL_Endpoint_Here
конечную точку API GraphQL, записанную ранее.
Сохраните файл.
В той же папке src откройте файл App.js и замените содержимое файла следующим фрагментом кода:
import React, { useState } from 'react'; import { PageLayout } from './components/PageLayout'; import { loginRequest, graphqlConfig } from './authConfig'; import { ProfileData } from './components/ProfileData'; import { AuthenticatedTemplate, UnauthenticatedTemplate, useMsal } from '@azure/msal-react'; import './App.css'; import Button from 'react-bootstrap/Button'; import Spinner from 'react-bootstrap/Spinner'; /** * Renders information about the signed-in user or a button to retrieve data about the user */ const ProfileContent = () => { const { instance, accounts } = useMsal(); const [graphqlData, setGraphqlData] = useState(null); const [display, setDisplay] = useState(false); function RequestGraphQL() { // Silently acquires an access token which is then attached to a request for GraphQL data instance .acquireTokenSilent({ ...loginRequest, account: accounts[0], }) .then((response) => { callGraphQL(response.accessToken).then((response) => setGraphqlData(response)); }); } async function callGraphQL(accessToken) { setDisplay(true); const query = `query { publicholidays (filter: {countryRegionCode: {eq:"US"}, date: {gte: "2024-01-01T00:00:00.000Z", lte: "2024-12-31T00:00:00.000Z"}}) { items { countryOrRegion holidayName date } } }`; fetch(graphqlConfig.graphqlEndpoint, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${accessToken}`, }, body: JSON.stringify({ query: query }) }) .then((res) => res.json()) .then((result) => setGraphqlData(result)); } return ( <> <h5 className="card-title">Welcome {accounts[0].name}</h5> <br/> {graphqlData ? ( <ProfileData graphqlData={graphqlData} /> ) : ( <Button variant="primary" onClick={RequestGraphQL}> Query Fabric API for GraphQL Data {display ? ( <Spinner as="span" animation="border" size="sm" role="status" aria-hidden="true" /> ) : null} </Button> )} </> ); }; /** * If a user is authenticated the ProfileContent component above is rendered. Otherwise a message indicating a user is not authenticated is rendered. */ const MainContent = () => { return ( <div className="App"> <AuthenticatedTemplate> <ProfileContent /> </AuthenticatedTemplate> <UnauthenticatedTemplate> <h5> <center> Please sign-in to see your profile information. </center> </h5> </UnauthenticatedTemplate> </div> ); }; export default function App() { return ( <PageLayout> <center> <MainContent /> </center> </PageLayout> ); }
Сохраните файл.
Наконец, в папке src/components откройте файл ProfileData.jsx и замените содержимое файла следующим фрагментом кода:
import React from "react"; import ListGroup from 'react-bootstrap/ListGroup'; import Table from 'react-bootstrap/Table'; /** * Renders information about the user obtained from MS Graph * @param props */ export const ProfileData = (props) => { const holidays = props.graphqlData.data.publicholidays.items; return ( <Table striped bordered hover responsive> <thead> <tr> <th>Country</th> <th>Holiday</th> <th>Date</th> </tr> </thead> <tbody> {holidays.map((item,i) => ( <tr key={i}> <td>{item.countryOrRegion}</td> <td>{item.holidayName}</td> <td>{item.date}</td> </tr> ))} </tbody> </Table> )};
Сохраните все изменения файла.
В выбранном приложении терминала перейдите в корневую папку проекта React и выполните команду
npm start
для локального тестирования приложения.После загрузки приложения в браузере
http://localhost:3000
выполните действия, описанные в последней части руководства по вызову API из приложения для проверки подлинности.После входа нажмите кнопку API Query Fabric для данных GraphQL.
Успешно прошедший проверку подлинности запрос к API GraphQL в Fabric возвращает данные из запроса GraphQL в Lakehouse в клиентском приложении React:
Использование субъекта-службы
Хотя шаги, описанные в предыдущем разделе, необходимы для предоставления доступа к субъектам-пользователям, также можно получить доступ к API GraphQL с помощью субъекта-службы:
- Выполните действия, описанные в предыдущем разделе, чтобы создать второе приложение Microsoft Entra. В новом приложении добавьте секрет клиента в разделе "Сертификаты и секреты", дополнительные сведения см. в разделе "Регистрация приложения Microsoft Entra" и создание субъекта-службы.
- На портале администрирования клиента перейдите к параметрам клиента. В разделе "Параметры разработчика" субъекты-службы могут использовать API Fabric. Если этот параметр включен, приложение будет отображаться на портале Fabric для назначения ролей или разрешений. Дополнительные сведения о поддержке удостоверений можно найти.
- Субъект-служба будет нуждаться в доступе как к API GraphQL, так и к источнику данных. На портале Fabric добавьте приложение в качестве члена рабочей области с ролью участника, где находятся как 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();
Остальные языки
Найдите C#, Python и другие языковые примеры для подключения к API GraphQL в репозитории GitHub примеров Microsoft Fabric.