入れ子になったアプリ認証 (NAA) の MSAL.js ライブラリを使用して、Office アドインからシングル サインオン (SSO) を有効にします。 この記事の手順では、アプリの登録を作成し、NAA を使用するコードをプロジェクトに追加する方法について説明します。
NAA でサポートされているアカウントとホスト
NAA では、Microsoft アカウントとMicrosoft Entra ID (職場/学校) の両方の ID がサポートされています。 ビジネスからコンシューマーへの ID 管理シナリオAzure Active Directory B2C はサポートされていません。 NAA 要件の詳細については、「 入れ子になったアプリ認証要件セット」を参照してください。
シングルページ アプリケーションを登録する
Azure portalでアドインの Microsoft Azure アプリ登録を作成する必要があります。 アプリの登録には、少なくとも次のものが必要です。
- 名前
- サポートされているアカウントの種類
- NAA の 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 グループには、Word、Excel、PowerPoint、Outlook、Teams が含まれています (Office が内部でアクティブ化されている場合)。
重要
Word、Excel、およびPowerPoint on the webの場合は、ブラウザーで標準の認証フローが使用されるため、追加のリダイレクトも必要です。 SPA リダイレクト URI は、MSAL.js ライブラリを使用して NAA を介してトークンを要求する HTML ページを参照する必要があります。
Office アドインのアプリ登録を設定するには、次の手順に従います。
Microsoft 365 テナントへの管理者資格情報を使用して、Azure portalにサインインします。 たとえば、「 MyName@contoso.onmicrosoft.com 」のように入力します。
[アプリの登録] を選択します。 アイコンが表示されない場合は、検索バーで "アプリの登録" を検索します。
[アプリの登録] ページが表示されます。
[新規登録] を選択します。
[アプリケーション登録] ページが表示されます。
[アプリケーションを登録] ページで、次のように値を設定します。
-
contoso-office-add-in-ssoに [名前] を設定します。 - [サポートされているアカウントの種類] を[任意の組織のディレクトリ (任意のAzure AD ディレクトリ - マルチテナント)] と個人用 Microsoft アカウント (Skype、Xbox など) に設定します。
- [ リダイレクト URI] を 設定して、プラットフォーム の単一ページ アプリケーション (SPA) を使用し、URI を
brk-multihub://localhost:3000します。 このリダイレクトでは、localhost サーバーからアドインをテストしていることを前提としています。
-
[登録] を選択します。 アプリケーション登録が作成されたことを示すメッセージが表示されます。
アプリケーション (クライアント) ID の値をコピーして保存します。 これは、この後の手順で使用します。
アドインでWord、Excel、またはPowerPoint on the webがサポートされている場合は、作業ウィンドウ ページの SPA リダイレクト URI を追加する必要があります。 次の手順を使用して、作業ウィンドウ ページの SPA リダイレクト URI を追加します。
- 左側のウィンドウで、[>認証の管理] を選択します。
- [ プラットフォームの構成 ] セクションには、 単一ページ アプリケーションのリダイレクト URI の一覧があります。
- [ URI の追加] を選択します。
- 「
https://localhost:3000/taskpane.html」と入力し、[ 保存] を選択します。 このリダイレクト URI は、taskpane.htmlファイルから NAA を使用していることを前提としています。
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」を参照してください。 最新バージョンをインストールするには、次のコマンドを実行します。npm install @azure/msal-browsertaskpane.jsまたはtaskpane.tsファイルの先頭に次のコードを追加します。 これにより、MSAL ブラウザー ライブラリがインポートされます。import { createNestablePublicClientApplication, InteractionRequiredAuthError } from "@azure/msal-browser";
Outlook では、次の手順は、Word、Excel、およびPowerPointの場合とは異なります。 ビルドするアドインの種類に対応するタブを選択します。
MSAL ライブラリを初期化する
次に、MSAL を初期化し、 パブリック クライアント アプリケーションのインスタンスを取得する必要があります。
taskpane.js または taskpane.ts ファイルに次のコードを追加します。
Enter_the_Application_Id_Here プレースホルダーを、前に保存したAzureアプリ ID に置き換えます。 次のコード ノートについて:
-
initMsal関数は、createNestablePublicClientApplicationを呼び出して MSAL を初期化します。 これにより、Outlok での SSO をサポートする入れ子になったパブリック クライアント アプリケーションが作成されます。 -
initMsal関数は、職場と学校のアカウントまたは個人の Microsoft アカウントをサポートする共通の権限を設定します。 1 つのテナントまたはその他のアカウントの種類を構成する場合は、「追加の権限 オプションのアプリケーション構成オプション 」を参照してください。
let msalInstance = undefined;
/**
* Initialize MSAL as a nestable public client application.
*/
async function initMsal() {
if (!msalInstance) {
const clientId = "Enter_the_Application_Id_Here";
const msalConfig = {
auth: {
clientId: clientId,
authority: "https://login.microsoftonline.com/common"
},
cache: {
cacheLocation: "localStorage"
}
};
msalInstance = await createNestablePublicClientApplication(msalConfig);
}
}
最初のトークンを取得する
NAA 経由で MSAL.js によって取得されたトークンは、Azure アプリ登録 ID に対して発行されます。 このコード サンプルでは、Microsoft Graph APIのトークンを取得します。 ユーザーがMicrosoft Entra IDでアクティブなセッションを持っている場合、トークンはサイレントで取得されます。 そうでない場合、ライブラリは対話形式でサインインするようにユーザーに求めます。 その後、トークンを使用して Microsoft Graph APIを呼び出します。
次の手順は、トークンの取得に使用するパターンを示しています。
- スコープを指定します。 NAA では増分同意と動的同意がサポートされているため、コードがタスクを完了するために必要な最小限のスコープを常に要求します。
-
acquireTokenSilentを呼び出します。 これにより、ユーザーの操作を必要とせずにトークンが取得されます。 -
acquireTokenSilent失敗した場合は、acquireTokenPopupを呼び出して、ユーザーの対話型ダイアログを表示します。acquireTokenSilentトークンの有効期限が切れている場合、またはユーザーが要求されたすべてのスコープにまだ同意していない場合は失敗する可能性があります。
次のコードは、この認証パターンを独自のプロジェクトに実装する方法を示しています。
taskpane.jsまたはtaskpane.tsのrun関数を次のコードに置き換えます。 このコードでは、ユーザーのファイルを読み取るために必要な最小スコープを指定します。export async function run() { await initMsal(); // Specify minimum scopes needed for the access token. const tokenRequest = { scopes: ["Files.Read", "User.Read"], }; let accessToken = null; // TODO 1: Use msalInstance to get an access token. // TODO 2: Call the Microsoft Graph API. }重要
トークン要求には、
offline_access、openid、profile、またはemail以外のスコープが含まれている必要があります。 前のスコープの任意の組み合わせを使用できますが、少なくとも 1 つの追加スコープを含める必要があります。 そうでない場合、トークン要求は失敗する可能性があります。TODO 1を次のコードに置き換えます。 このコードはacquireTokenSilentを呼び出してアクセス トークンを取得します。try { const userAccount = await msalInstance.acquireTokenSilent(tokenRequest); console.log("Acquired token silently."); accessToken = userAccount.accessToken; } catch (silentError) { // TODO 1a: Handle acquireTokenSilent failure. }TODO 1aを次のコードに置き換えます。 このコードは、acquireTokenSilentがInteractionRequiredAuthErrorをスローしたかどうかを確認します。 その場合、コードはacquireTokenPopupを呼び出して、MSAL がポップアップ ダイアログを使用してユーザーと対話できるようにします。 多要素承認の完了など、さまざまな理由で対話が必要になる場合があります。if (silentError instanceof InteractionRequiredAuthError) { console.log(`Unable to acquire token silently: ${silentError}`); // Silent acquisition failed. Continue to interactive acquisition. try { const userAccount = await msalInstance.acquireTokenPopup(tokenRequest); console.log("Acquired token interactively."); accessToken = userAccount.accessToken; } catch (popupError) { // Acquire token interactive failure. console.error(`Unable to acquire token interactively: ${popupError}`); return; } } else { // Acquire token silent failure. Error can't be resolved through interaction. console.error(`Unable to acquire token silently: ${silentError}`); return; }
API を呼び出す
トークンを取得した後、それを使用して API を呼び出します。 次の例では、Authorization ヘッダーにトークンがアタッチされた fetch を呼び出して、Microsoft Graph APIを呼び出す方法を示します。
TODO 2を次のコードに置き換えます。// 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: `Bearer ${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 をサポートしていないため、ユーザーを認証する別の方法にフォールバックする必要がある場合があります。 フォールバック シナリオを処理する方法を示すサンプルについては、この記事の コード サンプル を参照してください。
アドインの読み込み時に 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