次の方法で共有


GraphQL 用 Fabric API にアプリケーションを接続する

GraphQL 用 API にアプリケーションを接続するには、クライアント IDテナント ID、Fabric の GraphQL エンドポイント アドレスの 3 つの重要な情報が必要です。 以降のセクションでは、必要なすべての詳細を作成して取得する方法と、サンプル アプリケーションを使用して API にアクセスする方法について説明します。

前提条件

  • アプリケーションを接続する前に、Fabric で GraphQL 用の API を作成する必要があります。 詳細については、「Fabric で GraphQL 用 API を作成し、データを追加する」を参照してください。

  • 現在、GraphQL 用 API では、アプリケーションの認証に Microsoft Entra を使用する必要があります。 Fabric に対して API 呼び出しを実行するには、アプリケーションを登録して適切に構成する必要があります。 詳細については、「Azure で Microsoft Entra アプリを作成する」を参照してください。

  • API を呼び出す認証済み資格情報 (ユーザー プリンシパル、サービス プリンシパル、またはマネージド ID) には GraphQL API への実行アクセス許可 (直接アクセス許可を追加するときにクエリと変更を実行するオプション) が必要です。また、API の接続オプションとしてシングル サインオン (SSO) を使用する場合は、それに応じて、選択したデータ ソースで読み取りまたは書き込みアクセス許可が必要です。 詳細については、「データ ソースに接続し、スキーマを作成する」を参照してください。

Microsoft Entra アプリを作成する

次の手順では、Microsoft Entra で ReactJS アプリケーションのサポートを構成する方法について説明します。

  1. クイック スタート: Microsoft ID プラットフォームにアプリケーションを登録する」で説明されている手順を使用してアプリケーションを登録します。
  2. Microsoft Entra アプリの [アプリケーション (クライアント) ID][ディレクトリ (テナント) ID] の値が [概要] ボックスに表示されます。 これらの値は、後で必要になるため記録します。
  3. [管理] リストで、[API 権限] を選択し、[権限を追加] します。
  4. PowerBI サービスを追加し、委任されたアクセス許可を選択し、GraphQLApi.Execute.All アクセス許可を選択します。 管理者の同意が必要ないことを確認します。
  5. [管理] の一覧に戻り、[認証]>> の順に選択します。
  6. ローカル開発の目的で、http://localhost:3000 を追加し、Proof Key for Code Exchange (PKCE) を使用した認証コード フローに対してアプリケーションが有効になっていることを確認します。 [構成] ボタンを選択して、変更を保存します。 アプリケーションがクロスオリジン要求に関連するエラーを受け取った場合は、前の手順の モバイル アプリケーションとデスクトップ アプリケーション のプラットフォームを同じリダイレクト URI で追加します。
  7. 認証に戻り、下にスクロールして [詳細設定] を し、[パブリック クライアント フローのを許可 する] の下にある [はい] を選択 次のモバイル およびデスクトップ フローを有効にします。

アプリケーション アクセス用のサンプル GraphQL API を設定する

この例では、サンプルのレイクハウス データをクライアントに公開する GraphQL API を作成します。

  1. Fabric ポータルのホーム ページで、ワークロードの一覧から [Data Engineering] を選択します。

  2. データ エンジニア エクスペリエンスで、[サンプルの使用] を選択し、[レイクハウス][祝日] を選択すると、祝日データを含む新しいレイクハウスが自動的に作成されます。

    サンプル データ レイクハウス オプションの選択に関するスクリーンショット。

  3. GraphQL 用 API を作成する」の手順に従って、新しい GraphQL API を作成し、作成したレイクハウスを選択します。 祝日テーブルを追加して、クライアントがこのデータにアクセスできるようにします。

    GraphQL データ ソースとしてサンプルのレイクハウスを追加するスクリーンショット。

  4. 次のサンプル クエリを使用して、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
         }
       }
     }
    
  5. API 項目のツール バーで [エンドポイントのコピー] を選択します。

    API 項目のツール バー オプションのスクリーンショット。

  6. [リンクのコピー] 画面で、[コピー] を選択します。

    [コピー] を選択する場所が示されている、[リンクのコピー] ダイアログ画面のスクリーンショット。

  7. 前に記録した Microsoft Entra アプリのクライアント IDテナント ID として、後で必要になるためエンドポイント URI をコピーします。

祝日 API にアクセスするように React アプリを構成する

  1. 既存の React アプリを始点として使用します。 チュートリアル 「React シングルページ アプリケーションを作成し、認証用に準備する」のすべての手順に従って、Microsoft Entra 認証が既に構成されている React プロジェクトを作成します。これには、プロジェクト構造に追加する必要があるファイルとフォルダーが含まれます。 GraphQL のユース ケースに合わせてアプリを調整するために、変更する必要のあるファイルは 3 つだけです。

  2. 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/GraphQLApi.Execute.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/GraphQLApi.Execute.All です。

  3. 次の値を Microsoft Entra 管理センターから取得した値に置き換えます。

    • clientId - クライアントとも呼ばれる、アプリケーションの識別子。 Enter_the_Application_Id_Here を、登録した Microsoft Entra アプリケーションの概要ページから先ほど記録した [アプリケーション (クライアント) ID] の値に置き換えます。
    • authority - これは 2 つの部分で構成されます。
      • "インスタンス" はクラウド プロバイダーのエンドポイントです。 各国のクラウドの利用可能なさまざまなエンドポイントで確認します。
      • "テナント ID" は、アプリケーションが登録されているテナントの識別子です。 Enter_the_Tenant_Info_Here を、登録したアプリケーションの概要ページから先ほど記録したディレクトリ (テナント) ID の値に置き換えます。
    • graphQLEndpoint - GraphQL エンドポイントの Fabric API。 Enter_the_GraphQL_Endpoint_Here を前に記録した GraphQL API エンドポイントに置き換えます。
  4. ファイルを保存します。

  5. 同じ 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>
       );
     }
    
  6. ファイルを保存します。

  7. 最後に、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>
     )};
    
  8. ファイルの変更をすべて保存します。

  9. 選択したターミナル アプリケーションで、React プロジェクトのルート フォルダーに移動し、コマンド npm start を実行してアプリケーションをローカルでテストします。

  10. アプリケーションがブラウザーの http://localhost:3000 から読み込まれたら、チュートリアル 「アプリケーションから API を呼び出す」の最後の部分の手順に従って、認証します。

  11. サインインした後、[GraphQL データの Fabric API に対してクエリを実行する] ボタンをクリックします。

    サインイン後の React サンプル アプリのスクリーンショット。

  12. Fabric の GraphQL API に対する認証された要求が成功すると、GraphQL クエリから React クライアント アプリケーションのレイクハウスにデータが返されます。

    GraphQL 要求を受信した後の React サンプル アプリのスクリーンショット。

その他の言語

Microsoft Fabric サンプルの GitHub リポジトリで、GraphQL API に接続するための C#、Python、およびその他の言語サンプルを見つけます。