アクセス トークンを取得する

完了

常にアプリで Power BI コンテンツを埋め込む必要があるアクセス トークンを取得する場合は、Azure AD トークンを取得する必要があります。 顧客向けシナリオを使用する場合は、アプリで Azure AD トークンを使用して埋め込みトークンが生成されます。

明確にすべき事柄:

  • 組織向けシナリオ用のアクセス トークンは、付与されたアクセス許可を識別するためにアプリで使用される要求を含む Azure AD トークンです。
  • 顧客向けシナリオ用のアクセス トークンは、Power BI コンテンツとアプリがそれらにアクセスする方法に関するファクトを表す埋め込みトークンです。 アプリは、Power BI REST API 操作を使用して埋め込みトークンを生成します。この操作には、Azure AD トークンが必要です。

Azure AD トークンを取得する

Microsoft Authentication Library (MSAL) を使用して、Microsoft ID プラットフォームから Azure AD トークンを取得するアプリ ロジックを開発します。 MSAL は、.NET、JavaScript、Java、Python、Android、iOS などの、さまざまなアプリケーション アーキテクチャとプラットフォームをサポートしています。

ヒント

ASP.NET Core Web アプリを開発する場合は、Microsoft Identity Web 認証ライブラリを使用することをお勧めします。 このライブラリは、Microsoft.Identity.Web として知られるパッケージのセットです。 NuGet または Visual Studio からインストールできます。

MSAL を使用して Azure AD トークンを取得するためのさまざまなテクニックがあります。 Web ブラウザーを介したユーザー操作が必要なものもあれば、ユーザー操作を必要としないものもあります。 一般に、Azure AD トークンを取得するためにどの方法を選ぶかは、アプリケーションがパブリック クライアント アプリケーション (デスクトップ アプリやモバイル アプリなど) か、機密クライアント アプリケーション (Web アプリなど) かによって決まります。 埋め込みシナリオは、選択されたシナリオにも影響します。

Azure AD トークンを取得する手法を説明することは、このユニットの目的ではありません。 詳細については、「Microsoft Authentication Library (MSAL) を使用したトークンの取得とキャッシュ」を参照してください

ヒント

埋め込みセットアップ ツールのサンプル アプリがアプリの要件を満たしている場合は、サンプル コードをコピーして、Azure AD トークンを取得することを検討してください。

アプリで Azure AD トークンを取得できるようにするには、その構成ファイルに次の設定が含まれている必要があります。

  • TenantId - サービス プリンシパルにのみ必要です。 Azure AD TenantID です。
  • ClientId - 必須。 Azure AD アプリ ApplicationID (ClientID) です。
  • ClientSecret または ClientCertificate - サービス プリンシパルにのみ必要です。
  • PbiUsername - マスター ユーザー アカウントにのみ必要です。
  • PbiPassword - マスター ユーザー アカウントにのみ必要です。

重要

証明書、クライアント シークレット、マスター ユーザー アカウントの資格情報のいずれを使用する場合でも、それらを無許可のアクセスや使用から保護する手順を実行する必要があります。 クラウド内の暗号化キー、証明書、およびシークレットを保護する Azure Key Vault を使用することをお勧めします。

埋め込みトークンを取得する

Microsoft Power BI REST APIGenerateTokenRequestV2 操作を使用して、埋め込みトークンを要求します。 他の Power BI コンテンツ タイプの埋め込みトークンを生成する関連操作が他にもあります。 すべての API 操作に、Azure AD トークンが必要です。

ヒント

.NET アプリを開発する場合は、Microsoft.PowerBI.Api パッケージをインストールすることをお勧めします。 NuGet または Visual Studio からインストールできます。

埋め込みトークンを生成する方法を示す次のコードについて考えてみましょう。 このトークンには、ワークスペースからのすべてのレポートとデータセットの要求が含まれており、アプリ ユーザーはレポートを作成または編集することができます。 具体的には、次の処理が行われます。

  1. Power BI に接続します。
  2. レポート トークン要求を保存する reportTokenRequests という名前の変数を宣言します。
  3. ワークスペース内のすべてのレポートを列挙し、(ヘルパー クラスを使用して) EmbeddedReport オブジェクトの一覧を作成します。 各オブジェクトは、レポートの ID、名前、および埋め込み URL を記述します。 レポート ID は、アプリでトークンを生成するために必要です。 名前は、メニューでユーザーに提示するために必要です。埋め込み URL は、レポートを埋め込むために必要です。 このコードは、レポートの編集を可能にするレポート トークン要求を reportTokenRequests 変数に追加します。
  4. データセット トークン要求を保存する datasetTokenRequests という名前の変数を宣言します。
  5. ワークスペース内のすべてのデータセットを列挙し、(ヘルパー クラスを使用して) EmbeddedDataset オブジェクトの一覧を作成します。 各オブジェクトは、データセットの ID、名前、および埋め込み URL を記述します。 アプリには、トークンを生成するためにデータセットの ID が必要です。 名前はメニューでユーザーに提示するために必要な場合があり、埋め込み URL はデータセットを埋め込むために必要です。 このコードは、データセット トークン要求を datasetTokenRequests 変数に追加します。
  6. workspaceRequests 変数に追加されたワークスペース トークン要求 (ユーザーがレポートを作成するときに必要) を生成します。
  7. GenerateTokenRequestV2 メソッドを使用して、レポート トークン要求、データセット トークン要求、およびワークスペース トークン要求をまとめてバンドルします。
  8. GenerateTokenAsync を使用して、埋め込みトークンを生成します。
  9. 埋め込みトークンを文字列変数に保存します。
// Connect to Power BI
var client = GetPowerBiClient();

// Get reports in the workspace
var reports = (await client.Reports.GetReportsInGroupAsync(_workspaceId)).Value;

var reportList = new List<EmbeddedReport>();
var reportTokenRequests = new List<GenerateTokenRequestV2Report>();

foreach (var report in reports)
{
    reportList.Add(new EmbeddedReport
    {
        Id = report.Id.ToString(),
        Name = report.Name,
        EmbedUrl = report.EmbedUrl
    });

    reportTokenRequests.Add(new GenerateTokenRequestV2Report(report.Id, allowEdit: true));
}

// Get datasets in the workspace
var datasets = (await client.Datasets.GetDatasetsInGroupAsync(_workspaceId)).Value;

var datasetList = new List<EmbeddedDataset>();
var datasetTokenRequests = new List<GenerateTokenRequestV2Dataset>();

foreach (var dataset in datasets)
{
    datasetList.Add(new EmbeddedDataset
    {
        Id = dataset.Id.ToString(),
        Name = dataset.Name,
        EmbedUrl = dataset.QnaEmbedURL
    });

    datasetTokenRequests.Add(new GenerateTokenRequestV2Dataset(dataset.Id));
}

// Generate token request for the workspace
var workspaceRequests = new GenerateTokenRequestV2TargetWorkspace[] {
    new GenerateTokenRequestV2TargetWorkspace(_workspaceId)
};

// Bundle token requests for reports, datasets, and the workspace
var tokenRequest = new GenerateTokenRequestV2(
    reports: reportTokenRequests,
    datasets: datasetTokenRequests,
    targetWorkspaces: workspaceRequests
);

// Generate the embed token
string embedToken = (await client.EmbedToken.GenerateTokenAsync(tokenRequest)).Token;

アプリは、埋め込み HTML ページに embedToken 変数値を出力する必要があります。 その後で、クライアント側のロジックが、埋め込みトークンを使用して、div 要素にコンテンツを埋め込むことができます。

注意

Power BI コンテンツを埋め込む方法について学ぶには、「Power BI コンテンツを埋め込む」モジュールに取り組んでください。

アプリが埋め込みトークンを取得できるためには、その構成ファイルに埋め込み可能なコンテンツに関する詳細が含まれている必要があります。 このファイルには、特定の ReportID と DatasetID を含めることができます。または、より一般的に、埋め込み可能なコンテンツを含むワークスペースの GroupID を含めることができます。

詳細については、「埋め込みトークン - トークンの生成」を参照してください。

アクセス トークンの更新

アクセス トークンには有効期限があります。 アクセス トークンが生成されると、アプリ ユーザーは、それらを使用する Power BI コンテンツを操作できる時間が限られます。 アプリ ユーザーの継続的な操作を可能にするには、Power BI クライアント API を使用して、アプリで、有効期限が切れる前にアクセス トークンを更新する必要があります。

注意

クライアント API について学ぶには、「Power BI クライアント API を使用してコンテンツを統合する」モジュールに取り組んでください。

詳細については、アクセス トークンの更新に関するページをご覧ください。

その他のリソースを調査する

詳しくは、「Azure AD セキュリティに関する Power BI 開発者ガイド」ビデオ シリーズをご覧ください。 このシリーズは、理論を詳しく説明する 6 つのビデオで構成されています。 Microsoft の Power BI Customer Advisory Team (CAT) のメンバーである Ted Pattison がこのビデオ シリーズを制作しました。