入れ子になったアプリ認証で MSAL.js ライブラリを使用して、Office アドインからシングル サインオン (SSO) を使用できます。 入れ子になったアプリ認証 (NAA) を使用すると、On-Behalf-Of (OBO) フローよりもいくつかの利点があります。
- MSAL.js ライブラリのみを使用する必要があり、Office.js に
getAccessToken関数は必要ありません。 - クライアント コードからのアクセス トークンを SPA として使用して、Microsoft Graph などのサービスを呼び出すことができます。 中間層サーバーは必要ありません。
- スコープには増分同意と動的同意を使用できます。
- エンドポイントを呼び出すためにホスト (Teams、Office など) を 事前認証 する必要はありません。
NAA でサポートされているアカウントとホスト
NAA では、Microsoft アカウントとMicrosoft Entra ID (職場/学校) の両方の ID がサポートされています。 ビジネスからコンシューマーへの ID 管理シナリオAzure Active Directory B2C はサポートされていません。 次の表では、プラットフォームごとの現在のサポートについて説明します。 一般公開 (GA) として一覧表示されているプラットフォームは、アドインで運用環境で使用する準備ができています。
| アプリケーション | Web | Windows | Mac | iOS/iPad | Android |
|---|---|---|---|---|---|
| Excel | プレビュー | プレビュー | プレビュー | iPad のプレビュー中 | 該当なし |
| Outlook | GA | GA | GA | GA (iOS) | GA |
| PowerPoint | プレビュー | プレビュー | プレビュー | iPad のプレビュー中 | 該当なし |
| Word | プレビュー | プレビュー | プレビュー | iPad のプレビュー中 | 該当なし |
重要
プレビュー段階のプラットフォーム (Word、Excel、PowerPoint) で NAA を使用するには、Microsoft 365 Insider Program に参加し、[現在のチャネル (プレビュー)] を選択します。 プレビュー プラットフォームの運用環境アドインでは NAA を使用しないでください。 テスト環境または開発環境で NAA を試し、GitHub を通じてエクスペリエンスに関するフィードバックを歓迎することをお勧めします (このページの最後にある フィードバック セクションを参照してください)。
Microsoft Teamsでの NAA の使用については、「 Microsoft Teamsでの入れ子になったアプリ認証」を参照してください。
シングルページ アプリケーションを登録する
Azure portalでアドインの Microsoft Azure アプリ登録を作成する必要があります。 アプリの登録には、少なくとも次のものが必要です。
- 名前
- サポートされているアカウントの種類
- SPA リダイレクト
アドインで NAA と SSO 以外の追加のアプリ登録が必要な場合は、「 シングルページ アプリケーション: アプリの登録」を参照してください。
SPA リダイレクトを使用して信頼できるブローカーを追加する
NAA を有効にするには、アプリの登録に特定のリダイレクト URI を含め、アドインでサポートされているホストによるブローカーが許可されていることをMicrosoft ID プラットフォームに示す必要があります。 アプリケーションのリダイレクト URI は 、単一ページ アプリケーション の種類で、次のスキームに準拠している必要があります。
brk-multihub://your-add-in-domain
ドメインには、サブパスではなく、配信元のみを含める必要があります。 以下に例を示します。
✔️ brk-multihub://localhost:3000
✔️ brk-multihub://www.contoso.com
❌ brk-multihub://www.contoso.com/go
信頼されたブローカー グループは設計上動的であり、今後更新して、アドインが NAA フローを使用する可能性がある追加のホストを含めることができます。 現在、brk-multihub グループには、Office Word、Excel、PowerPoint、Outlook、Teams が含まれています (Office が内部でアクティブ化されている場合)。
NAA を使用するように MSAL 構成を構成する
MSAL で createNestablePublicClientApplication 関数を呼び出して、NAA を使用するようにアドインを構成します。 MSAL は、ネイティブ アプリケーション ホスト (Outlook など) に入れ子にして、アプリケーションのトークンを取得できるパブリック クライアント アプリケーションを返します。
次の手順では、yo office (Office アドイン作業ウィンドウ プロジェクト) でビルドされたプロジェクトで、taskpane.jsまたはtaskpane.ts ファイルで NAA を有効にする方法を示します。
@azure/msal-browserパッケージをプロジェクトのpackage.jsonファイルのdependenciesセクションに追加します。 このパッケージの詳細については、「 Microsoft Authentication Library for JavaScript (MSAL.js) for Browser-Based Single-Page Applications」を参照してください。 最新バージョンのパッケージを使用することをお勧めします (前回の記事の更新時点では 3.26.0 でした)。"dependencies": { "@azure/msal-browser": "^3.27.0", ...npm installを保存して実行して、@azure/msal-browserをインストールします。taskpane.jsまたはtaskpane.tsファイルの先頭に次のコードを追加します。 これにより、MSAL ブラウザー ライブラリがインポートされます。import { createNestablePublicClientApplication } from "@azure/msal-browser";
パブリック クライアント アプリケーションを初期化する
次に、MSAL を初期化し、 パブリック クライアント アプリケーションのインスタンスを取得する必要があります。 これは、必要に応じアクセス トークンを取得するために使用されます。 パブリック クライアント アプリケーションを作成するコードを Office.onReady メソッドに配置することをお勧めします。
Office.onReady関数で、次に示すようにcreateNestablePublicClientApplicationへの呼び出しを追加します。Enter_the_Application_Id_Hereプレースホルダーを、前に保存したAzureアプリ ID に置き換えます。let pca = undefined; Office.onReady(async (info) => { if (info.host) { document.getElementById("sideload-msg").style.display = "none"; document.getElementById("app-body").style.display = "flex"; document.getElementById("run").onclick = run; // Initialize the public client application pca = await createNestablePublicClientApplication({ auth: { clientId: "Enter_the_Application_Id_Here", authority: "https://login.microsoftonline.com/common" }, }); } });
注:
前のコード サンプルでは、職場と学校のアカウントまたは個人の Microsoft アカウントをサポートする共通の権限を設定します。 1 つのテナントまたはその他のアカウントの種類を構成する場合は、「追加の権限 オプションのアプリケーション構成オプション 」を参照してください。
最初のトークンを取得する
NAA 経由で MSAL.js によって取得されたトークンは、Azure アプリ登録 ID に対して発行されます。 このコード サンプルでは、Microsoft Graph APIのトークンを取得します。 ユーザーがMicrosoft Entra IDでアクティブなセッションを持っている場合、トークンはサイレントで取得されます。 そうでない場合、ライブラリは対話形式でサインインするようにユーザーに求めます。 その後、トークンを使用して Microsoft Graph APIを呼び出します。
次の手順は、トークンの取得に使用するパターンを示しています。
- スコープを指定します。 NAA では増分同意と動的同意がサポートされているため、コードがタスクを完了するために必要な最小限のスコープを常に要求します。
-
acquireTokenSilentを呼び出します。 これにより、ユーザーの操作を必要とせずにトークンが取得されます。 -
acquireTokenSilent失敗した場合は、acquireTokenPopupを呼び出して、ユーザーの対話型ダイアログを表示します。acquireTokenSilentトークンの有効期限が切れている場合、またはユーザーが要求されたすべてのスコープにまだ同意していない場合は失敗する可能性があります。
次のコードは、この認証パターンを独自のプロジェクトに実装する方法を示しています。
taskpane.jsまたはtaskpane.tsのrun関数を次のコードに置き換えます。 このコードでは、ユーザーのファイルを読み取るために必要な最小スコープを指定します。async function run() { // Specify minimum scopes needed for the access token. const tokenRequest = { scopes: ["Files.Read", "User.Read", "openid", "profile"], }; let accessToken = null; // TODO 1: Call acquireTokenSilent. // TODO 2: Call acquireTokenPopup. // TODO 3: Log error if token still null. // TODO 4: Call the Microsoft Graph API. }重要
トークン要求には、
offline_access、openid、profile、またはemail以外のスコープが含まれている必要があります。 前のスコープの任意の組み合わせを使用できますが、少なくとも 1 つの追加スコープを含める必要があります。 そうでない場合、トークン要求は失敗する可能性があります。TODO 1を次のコードに置き換えます。 このコードはacquireTokenSilentを呼び出してアクセス トークンを取得します。try { console.log("Trying to acquire token silently..."); const userAccount = await pca.acquireTokenSilent(tokenRequest); console.log("Acquired token silently."); accessToken = userAccount.accessToken; } catch (error) { console.log(`Unable to acquire token silently: ${error}`); }TODO 2を次のコードに置き換えます。 このコードは、アクセス トークンが取得されているかどうかを確認します。 そうでない場合は、acquireTokenPopupを呼び出してアクセス トークンを対話形式で取得しようとします。if (accessToken === null) { // Acquire token silent failure. Send an interactive request via popup. try { console.log("Trying to acquire token interactively..."); const userAccount = await pca.acquireTokenPopup(tokenRequest); console.log("Acquired token interactively."); accessToken = userAccount.accessToken; } catch (popupError) { // Acquire token interactive failure. console.log(`Unable to acquire token interactively: ${popupError}`); } }TODO 3を次のコードに置き換えます。 サイレント サインインと対話型サインインの両方が失敗した場合は、エラーをログに記録して返します。// Log error if both silent and popup requests failed. if (accessToken === null) { console.error(`Unable to acquire access token.`); return; }
API を呼び出す
トークンを取得した後、それを使用して API を呼び出します。 次の例では、Authorization ヘッダーにトークンがアタッチされた fetch を呼び出して、Microsoft Graph APIを呼び出す方法を示します。
TODO 4を次のコードに置き換えます。// Call the Microsoft Graph API with the access token. const response = await fetch( `https://graph.microsoft.com/v1.0/me/drive/root/children?$select=name&$top=10`, { headers: { Authorization: accessToken }, } ); if (response.ok) { // Write file names to the console. const data = await response.json(); const names = data.value.map((item) => item.name); // Be sure the taskpane.html has an element with Id = item-subject. const label = document.getElementById("item-subject"); // Write file names to task pane and the console. const nameText = names.join(", "); if (label) label.textContent = nameText; console.log(nameText); } else { const errorText = await response.text(); console.error("Microsoft Graph call failed - error text: " + errorText); }
前のすべてのコードが run 関数に追加されたら、作業ウィンドウのボタンが run 関数を呼び出していることを確認します。 その後、アドインをサイドロードし、コードを試すことができます。
入れ子になったアプリ認証とは
入れ子になったアプリ認証を使用すると、サポートされている Microsoft アプリケーション内に入れ子になっているアプリケーションの SSO が有効になります。 たとえば、Excel on Windows では、Web ビュー内でアドインが実行されます。 このシナリオでは、アドインは Excel 内で実行されている入れ子になったアプリケーションであり、これがホストです。 NAA では、Teams の入れ子になったアプリもサポートされています。 たとえば、Teams タブが Excel をホストしていて、アドインが読み込まれている場合、アドインは Excel 内に入れ子になり、Teams 内にも入れ子になります。 ここでも、NAA はこの入れ子になったシナリオをサポートしており、SSO にアクセスして、サインインしているユーザーのユーザー ID とアクセス トークンを取得できます。
ベスト プラクティス
NAA で MSAL.js を使用する場合は、次のベスト プラクティスをお勧めします。
可能な限りサイレント認証を使用する
MSAL.js は、ユーザーにプロンプトを表示せずにサイレント トークン要求を行うことでトークンの更新を処理する acquireTokenSilent メソッドを提供します。 メソッドは、最初に有効なキャッシュされたトークンを検索します。 見つからない場合、ライブラリはサイレント要求をMicrosoft Entra IDし、アクティブなユーザー セッションがある場合は、新しいトークンが返されます。
場合によっては、 acquireTokenSilent メソッドによるトークンの取得が失敗します。 たとえば、Microsoft Entra IDを使用したユーザー セッションが期限切れになっている場合や、ユーザーによるパスワードの変更があり、ユーザーの操作が必要な場合です。 acquireTokenSilent が失敗した場合は、対話型の acquireTokenPopup トークン メソッドを呼び出す必要があります。
NAA がサポートされていない場合にフォールバックを行う
Microsoft エコシステム全体でこれらのフローとの高度な互換性を提供するよう努めていますが、アドインは NAA をサポートしていない古い Office ホストに読み込まれる場合があります。 このような場合、アドインはシームレス SSO をサポートしていないため、ユーザーを認証する別の方法にフォールバックする必要がある場合があります。 一般に、 OFFICE JS ダイアログ API で MSAL SPA 認証パターンを使用する必要があります。
アドインの読み込み時に NAA がサポートされているかどうかをチェックするには、次のコードを使用します。
Office.context.requirements.isSetSupported("NestedAppAuth", "1.1");
詳細については、次の資料を参照してください。
- Office ダイアログ API を使用して認証と承認を行います。
- SPA と JavaScript の Microsoft ID サンプル
- さまざまなアプリの種類とフレームワークの Microsoft ID サンプル
NAA でサポートされている MSAL.js API
次の表は、MSAL 構成で NAA が有効になっている場合にサポートされる API を示しています。
| メソッド | NAA でサポートされる |
|---|---|
acquireTokenByCode |
いいえ (例外をスローします) |
acquireTokenPopup |
はい |
acquireTokenRedirect |
いいえ (例外をスローします) |
acquireTokenSilent |
はい |
addEventCallback |
はい |
addPerformanceCallback |
いいえ (例外をスローします) |
disableAccountStorageEvents |
いいえ (例外をスローします) |
enableAccountStorageEvents |
いいえ (例外をスローします) |
getAccountByHomeId |
はい |
getAccountByLocalId |
はい |
getAccountByUsername |
はい |
getActiveAccount |
はい |
getAllAccounts |
はい |
getConfiguration |
はい |
getLogger |
はい |
getTokenCache |
いいえ (例外をスローします) |
handleRedirectPromise |
不要 |
initialize |
はい |
initializeWrapperLibrary |
はい |
loginPopup |
はい |
loginRedirect |
いいえ (例外をスローします) |
logout |
いいえ (例外をスローします) |
logoutPopup |
いいえ (例外をスローします) |
logoutRedirect |
いいえ (例外をスローします) |
removeEventCallback |
はい |
removePerformanceCallback |
いいえ (例外をスローします) |
setActiveAccount |
不要 |
setLogger |
はい |
ssoSilent |
はい |
セキュリティ レポート
ライブラリまたはサービスに関するセキュリティの問題が見つかる場合は、問題を報告して、提供できる限り詳細に secure@microsoft.com してください。 提出物は、Microsoft 報奨金プログラムを通じて 報奨金 の対象となる場合があります。 GitHub やその他のパブリック サイトにセキュリティの問題を投稿しないでください。 問題レポートを受け取った直後に、お客様に連絡します。 セキュリティ アドバイザリ アラートをサブスクライブするには、 Microsoft のテクニカル セキュリティ通知 にアクセスして、新しいセキュリティ インシデント通知を受け取ることをお勧めします。
コード サンプル
| サンプルの名前 | 説明 |
|---|---|
| 入れ子になったアプリ認証を使用した SSO を使用した Office アドイン | Office アドインで NAA を使用して、サインインしているユーザーの Microsoft Graph API にアクセスする方法について説明します。 |
| 入れ子になったアプリ認証を使用した SSO を使用した Outlook アドイン | Outlook アドインで NAA を使用して、サインインしているユーザーの Microsoft Graph API にアクセスする方法について説明します。 |
| 入れ子になったアプリ認証を使用して Outlook アドインのイベントに SSO を実装する | Outlook アドイン イベントで NAA と SSO を使用する方法を示します。 |
| 入れ子になったアプリ認証 (NAA) と SSO を使用して ID 要求をリソースに送信する | サインインしているユーザーの ID 要求 (名前、電子メール、一意の ID など) をデータベースなどのリソースに送信する方法を示します。 このサンプルでは、レガシ Exchange Online トークンの古いパターンを置き換えます。 |
関連項目
Office Add-ins