さまざまな企業で採用が広がるMicrosoft Teamsタブアプリの開発では、Azure ADとの連携を通じたシングルサインオン(SSO)が非常に重要です。ところが、設定を一通り済ませたはずなのに「App resource defined in manifest and iframe origin do not match」というエラーに直面することも珍しくありません。本記事では、具体的な対策や設定手順のポイントを分かりやすく解説します。
SSOエラーが発生する背景
SSOエラー「App resource defined in manifest and iframe origin do not match」は、Teams上で動作するタブアプリのドメイン情報やアプリ登録時のリソースURIに齟齬があるときに起こりやすい現象です。特に、Azure AD側で設定したApplication ID URIとTeamsのmanifestファイル内のwebApplicationInfo.resource
の設定が一致しない場合に頻発します。
また、Teamsタブアプリで表示されるページはiframeとして埋め込まれますが、iframeのオリジン(ドメイン+ポート)とAzure ADのアプリに登録された情報が微妙に異なる場合もエラーを引き起こす原因となります。ローカル開発環境でポート番号が変わる、またはSSL証明書を導入していないなど、設定の相違によって起こるケースが多々存在します。
リソースURIとiframeオリジンの関連性
Teamsタブアプリでは、下記のフローでユーザーの認証情報が取得されます。
- ユーザーはTeams上でタブを開く
- タブ内で埋め込まれたiframeを通じてアプリが表示される
- ReactやFluent UIなどで構築されたフロントエンドが、SSOトークンを取得しようとする
- Azure ADに登録されたアプリケーション情報をもとにトークンが返却される
この際、Azure ADに登録したApplication ID URI
と、Teamsのmanifestファイルに記載のwebApplicationInfo.resource
が一致しないと、正当なリソースとして認識できず「App resource defined in manifest and iframe origin do not match」といったエラーが返ってきます。
ReactとFluent UIによる実装のポイント
Microsoft TeamsタブアプリでSSOを実装する場合、多くのプロジェクトではフロントエンドにReactとFluent UIを組み合わせることが一般的です。UIパーツを素早く整えられるメリットがありますが、SSO部分は別途Azure ADアプリ登録の正確な設定が不可欠です。
Teams ToolkitやMSALの活用
- Teams Toolkit: Visual Studio Code上での開発をスムーズに進めるための拡張機能。Azure ADアプリ登録などを自動的に行ってくれるケースもありますが、複数の環境(開発/ステージング/本番)で異なる設定が必要になる際は、手動での微調整が必要です。
- MSAL (Microsoft Authentication Library): フロントエンドからトークンを取得するときに利用されるライブラリ。Teams SDKと組み合わせて使われることが多く、例えば
@azure/msal-browser
などが代表的です。clientId
やauthority
、そしてredirectUri
の設定に注意が必要になります。
関連パッケージの確認
以下に、ReactやFluent UIのセットアップに加えて確認しておきたい主要パッケージを示します。これらが正しくインストールされ、バージョンが互いに適切であるかもチェックポイントとなります。
パッケージ名 | 役割 | メモ |
---|---|---|
@microsoft/teams-js | TeamsのSDK。タブアプリ内部での各種操作をサポート。 | 現在は@microsoft/teams-js のv2などが推奨 |
@azure/msal-browser | ブラウザ環境でのMSAL実装。SSOでトークン取得に利用。 | バージョンアップが頻繁なため更新に注意 |
react | フロントエンドフレームワーク | バージョン差異に注意 |
@fluentui/react | Microsoftが提供するUIコンポーネント群 | アプリケーションのUI一貫性を保つ |
Azure ADでのアプリ登録と設定
TeamsタブアプリのSSOを確立するうえで、Azure AD上での設定が最も重要です。必要となる設定項目は以下のとおりです。
- アプリケーションの登録
Azure AD管理ポータルで新しいアプリケーションを登録します。名前、リダイレクトURIなどを指定し、本番用と開発用で分けて作成すると管理しやすくなります。 - リダイレクトURI
ローカル環境ならhttps://localhost:ポート
、本番環境ならhttps://myproductiondomain.com
など、実際にiframeのオリジンとなるドメインを設定します。間違ってHTTPやポート番号を省略すると、SSOトークンが正しく返されません。 - Application ID URI
Azure AD上で指定するリソースURIです。SSO実装時はここが特に重要です。
例:api://mydomain.com/{AppID}
多くのチュートリアルではapi://
で始まるURIを推奨しています。ドメイン+AppIDなどユニークになる形で指定することが推奨されています。 - 認証の種類(Access tokens, ID tokens)
「アクセストークンを有効にする」「IDトークンを有効にする」のチェックボックスを必要に応じてオンにします。タブアプリからはIDトークンを使うケースが多いですが、バックエンドと連携させる場合はアクセストークンも必要になります。
Teamsのmanifest設定
Teamsアプリを登録する際のmanifestファイル内では、下記のようにwebApplicationInfo
を定義します。
{
"webApplicationInfo": {
"id": "my-aad-app-client-id",
"resource": "api://mydomain.com/my-aad-app-client-id"
}
}
id
: Azure ADポータルで取得したクライアントID(アプリケーションID)resource
: Azure ADで設定したApplication ID URI
これらが食い違うとTeamsのSSO認証時にエラーが発生します。また、ここで指定したresource
の文字列と、Azure ADアプリ登録画面で設定したApplication ID URI
が完全一致している必要がある点が最大の注意事項です。
具体的なエラー原因と対策
本題である「App resource defined in manifest and iframe origin do not match」エラーについて、ありがちな原因と対策を以下の表にまとめます。
原因 | 想定するミス | 対応策 | メモ |
---|---|---|---|
Azure ADのApplication ID URI とTeams manifestのwebApplicationInfo.resource が一致していない | 誤ってapi://{AppID} 、またはapi://localhost/{AppID} などを設定してしまった | 本番ドメインの場合はapi://mydomain.com/{AppID} のように、FQDNを含む形で両方を合わせる | 一文字でもずれると認証に失敗 |
リダイレクトURIの設定ミス | HTTPSをHTTPで登録している、ポート番号が合っていない | Azure ADポータル上で正しいプロトコルとポート番号を設定。例:https://localhost:53000 | ローカル開発時と本番環境で複数のリダイレクトURIを設定する必要がある場合が多い |
iframeで表示されるドメインとAzure AD登録が食い違っている | localhostと127.0.0.1を混在させてしまったり、別ドメインを指定してしまった | localhostで開発する場合も本番ドメインに合わせたFQDN形式の設定が必要な場合がある。TeamsのSSOデバッグ時は特に注意 | SSLを導入していないとエラーになるケースもある |
id (クライアントID)が誤っている | 複数のアプリ登録を行った結果、別のアプリのクライアントIDを配置している | manifestファイルとAzure ADポータルの「アプリケーション(クライアント)ID」が対応するか要確認 | 桁数が同じでも文字列が違うため注意 |
MSALやTeams SDKの設定に不備がある | authority やclientId が誤っている、あるいは許可されたスコープの設定が正しくない | MSALの初期化部分とTeams SDKからの呼び出し箇所で設定の整合性を確認 | スコープ設定が不足しているとトークンが取得できない |
最終的な解決策の手順
本番ドメインを踏まえた設定例をもとにした、具体的な解決策のフローを整理します。
- Azure AD上でFQDN形式のApplication ID URIを設定
例:api://mydomain.com/{AppID}
開発環境を切り替える際は、api://dev.mydomain.com/{AppID}
のようにステージング専用のアプリ登録を行うのも一案です。 - Teams manifestの
webApplicationInfo.resource
を合わせる
例:
{
"webApplicationInfo": {
"id": "xxxxx-xxxxx-xxxxx",
"resource": "api://mydomain.com/xxxxx-xxxxx-xxxxx"
}
}
ここでid
の値はAzure ADの「アプリケーション(クライアント)ID」を正確に入力します。
- リダイレクトURIを正しく登録
- ローカル環境なら
https://localhost:53000
- 本番環境なら
https://mydomain.com
など
チーム内で複数の開発者が異なるポートを使う場合は、各自が使うポートごとにAzure ADに登録するか、極力ポートを固定しておくと混乱が少なくなります。
- MSAL/Teams SDKの設定確認
authority
やclientId
、スコープなどが正しく設定されているか最終チェックを行います。特にスコープでapi://mydomain.com/{AppID}/.default
のように指定するケースでは、URIと一致している必要があります。 - Teamsアプリを再インストール/更新
manifestを修正した後は、一度Teams上で更新手続きを行う必要があります。特に組織内で公開しているアプリであれば、管理者承認プロセスが走る場合もあるため、更新のタイミングを慎重に計画します。
ローカル開発と本番環境での注意点
SSOの設定は、ローカル開発と本番環境で大きく異なる部分があります。ローカル開発時はlocalhost
を使うことが多いですが、本番環境では独自ドメイン+HTTPS化が必須になるケースが多いです。下記の点を意識すると移行のトラブルを減らせます。
- HTTPS対応
本番ではHTTPSが基本です。Azure ADもHTTPS以外のリダイレクトURIを受け付けない設定を推奨しています。ローカル環境でも自己署名証明書を使うなどしてHTTPSで開発を行うと、本番とのギャップが埋まりやすくなります。 - ポート番号
ローカル開発で53000
番ポートを使っている場合、本番では標準の443にするなど切り替えが発生します。複数のリダイレクトURIを登録していても、余計なURIはなるべく整理しておくとエラーリスクが軽減します。 - ドメイン名
ローカルでlocalhost
、本番でmydomain.com
となるため、Application ID URI
やwebApplicationInfo.resource
も都度変更が必要です。テスト環境でも独自ドメインを用意している場合は、別々のアプリ登録を作るのが安全です。
SSOトークン取得フローのデバッグ
TeamsタブアプリでSSOのデバッグを行う場合、以下の方法が役立ちます。
- ブラウザの開発者ツール
ネットワークタブでトークンリクエストが成功しているか、レスポンスはどうなっているかを確認できます。エラーがあれば詳しいメッセージが返されることが多いです。 - TeamsのDeveloper Previewモード
開発者プレビューを有効にすると、最新のTeams機能が利用できたり、エラー発生時の詳細情報が表示されやすくなります。 - MSALのログレベル調整
MSALにはログのレベルを指定する設定があるため、詳細ログを出すことで原因特定がスムーズになります。
実際の成功事例: 「api://mydomain.com/{AppID}」への変更
あるプロジェクトで、当初は以下のように設定していたために「App resource defined in manifest and iframe origin do not match」エラーが頻発しました。
- Azure ADアプリ登録画面 →
Application ID URI
:api://{AppID}
- Teams manifest →
webApplicationInfo.resource
:api://{AppID}
- 実際の運用ドメイン:
https://mydomain.com
ここで本番ドメインを加味し、Azure ADのApplication ID URI
をapi://mydomain.com/{AppID}
に変更し、manifestも同じURIに修正しました。その結果、エラーが解消し、SSOトークンを正常に取得できるようになりました。
ベストプラクティスとまとめ
SSOエラーを回避するためには、以下のベストプラクティスを押さえておくと安心です。
- ドメインとURIを厳格に管理
開発・テスト・本番と複数の環境がある場合は、それぞれに対応したApplication ID URI
を用意し、Teams manifestのresource
も揃えておく。 - HTTPSとFQDNの早期導入
ローカル開発でもHTTPSとFQDNサブドメインを設定しておくと、本番移行時のトラブルを減らせる。 - MSAL/Teams SDKのバージョン管理
バージョンアップによりパラメータや関数の仕様が変わる場合があるため、ドキュメントを定期的に確認しながらメンテナンスする。 - トラブルシューティングのログ活用
開発者ツールやMSALのログ出力などを駆使し、どのタイミングでエラーが発生しているのかを詳細に調べることが大切。 - 最終チェックとしての再インストール
manifestを修正したら、Teams上のタブアプリを再インストールまたは更新する。更新が反映されずに古いmanifestのままテストをしてしまうと、正しい結果を得られない。
以上の対策を講じることで、TeamsタブアプリにおけるSSO実装時の「App resource defined in manifest and iframe origin do not match」エラーを効率よく解消できます。FQDNを用いたApplication ID URIの設定が最も肝心なポイントなので、環境ごとにURIを管理しやすい仕組みづくりを進めておくとよいでしょう。社内ポータルや外部サービスとの連携など、今後ますます需要が高まるTeamsタブアプリを円滑に運用するためにも、早めの対策が重要です。
コメント