
OmniのダッシュボードやAIチャット機能を提供するアプリに簡単に埋め込み可能!Standard SSOのEmbeddingを試してみた
さがらです。
Omniでは、ダッシュボード・WorkbookのExplore・AIチャット機能をEmbedding(埋め込み)できる機能があります。(先日、NotionへのEmbeddingを試していました。)
OmniのEmbeddingの方法は大きく「Standard SSO」と「2-step SSO」の2種類があるのですが、今回は「Standard SSO」について試してみたので、本記事で内容をまとめてみます。
Standard SSOと2-step SSOの違い
以下は公式Docの情報を参考にAIにまとめてもらった内容ではありますが、このような違いがあります。
| 観点 | Standard SSO | 2-step SSO |
|---|---|---|
| ざっくり何が違う? | 署名付きログインURLを1本作って iframe に渡すだけでログインまで完了する「1ステップ」方式 | (1) POSTでセッション生成 → (2) redeem URLで遷移の「2ステップ」方式 |
| フロー(手順) | 1. サーバー側で署名付きURL生成 2. iframe の src に設定して表示 |
1. POST /api/unstable/embed/sso/generate-session で sessionId を発行 2. embed/sso/redeem-session の署名付きURLで sessionId を redeem(iframe に設定) |
| パラメータの渡し方 | 主に URLクエリで渡す(contentPath, externalId, name, userAttributes, フィルタなど) | 多くは POSTのJSONボディで渡す(contentPath, externalId, name, 権限/属性など) URLは主に sessionId / nonce / signature(+theme/prefersDark) |
| 機密データ(例:userAttributes)の扱い | URLに載り得るため、運用によっては ログ/履歴/解析ツールなどへの露出が気になることがある | 機微な属性を POSTに寄せられるため、URL露出を抑えたい場合に有利 |
| URL長制限リスク | パラメータが増えるほど URLが長大化し、ブラウザ等のURL文字数上限に当たる可能性が相対的に上がる | redeem URLがコンパクトになり、URL長制限リスクをほぼ回避できる |
| 必要な認証要素 | Embed secret による URL署名(※URLは必ずサーバー側で生成推奨) | ステップ1:**Omni API Key(Bearer)**でPOSTを認証 ステップ2:Embed secret による redeem URL署名 |
| セッション有効期限の考え方 | 通常の embed セッション(管理画面の Session Length 設定に従う) | 発行直後の embed セッションは 5分以内にredeem必須(未redeemだと無効) redeem成功後に **24時間(またはSession Length)**へ延長 |
| 実装の難易度 | 簡単:サーバーで署名付きURLを作って iframe に渡す | やや複雑:API呼び出し、sessionId管理、redeem用署名生成が必要(ただしURLは短く保てる) |
| 署名のイメージ | 「ログインURL(多数のクエリ付き)」を署名して検証してもらう | 「redeem URL + nonce + sessionId(必須) + theme/prefersDark(任意)」を決められた順序で連結して署名する |
| どんなときに選ぶ? | まずは最短で埋め込みを動かしたい、URLパラメータが増えない/機密性が問題になりにくい | userAttributes等の機微情報がある、URLが長くなりそう、より堅牢に運用したい |
個人的には、この2つの差分は「ログインURLに何を載せるか」と「セッションをいつ・どこで確定させるか」に集約されると思っています。Standard SSO は “署名付きURLを作って渡すだけ” なので実装がシンプルで、まず動かすには最短ルートです。一方で、ユーザー属性や権限、フィルタなどを詰め込んでいくとURLが長くなりやすく、場合によっては URL 経由で情報が露出する点(ログ、履歴、解析ツール等)が気になってきます。
2-step SSO はこのURL経由で情報が露出する点をカバーしており、ユーザー情報の大半をPOST(JSON)側に寄せ、URLは「sessionIdをredeemするための最小限」にする設計です。その代わり、APIキーの管理や sessionId の扱い、redeem用署名の生成などが増えるので、実装はやや手間になります。
まとめると、Standard SSOで十分なケースが多い一方で、「userAttributes に機微なデータを載せたい/URL長が不安/より堅牢に運用したい」という要件が出てきたら 2-step SSOを検討するのが良いと思います。
事前準備:OmniのEmbedding機能を有効化
OmniのEmbedding機能はデフォルトでは有効化されていないため、カスタマーサポートなどに連絡して、OmniのEmbedding機能を有効化してもらいます。
有効化すると、Settingsの項目にEmbedが追加されます。

事前準備:OmniでEmbeddingしたいコンテンツを作成
EmbeddingするにはOmniで事前にダッシュボードなどのコンテンツを作成しておく必要があります。
今回は以下のようにダッシュボードを作成しておきました。

また、EmbeddingするためにURLを確認しておきます。今回で言うと、先頭のOrganization名と、/dashboards/51e24001を、後で使用します。

Omni上でEmbedding用のSecretを生成
OmniのトップページからSettingsを押して、Embedを開きます。

次に、Embed Secret欄で一度Press the "Reset Secret”の横のUnlockを押してから、Confirmを押し、Reset Secretを押します。



するとこのようにSecretが表示されるので、コピーして保持しておきます。(この画面で一度だけしか表示されないため注意しましょう。)

デモ用のアプリからEmbeddingを試してみる
次に認証用のデモアプリが必要となるのですが、Claude CodeとAntigravityを使って、簡単なFlaskアプリを作成しました。Publicにしているため、以下のリポジトリから利用できます。(パッケージ管理にuvを使用しているため、ご注意ください。)
.envファイルにSecretなど必要な情報を書く仕様となっているので、.envファイルを作成し、以下のように5つの値を記入してください。
OMNI_EXTERNAL_IDとOMNI_USER_NAMEは、自由に入力して問題ありません。ここで入力した値で、Omni側で自動でユーザーが作成されます。
| 変数名 | 説明 | 例 |
|---|---|---|
OMNI_EMBED_ORG_SLUG |
組織スラッグ | blobsrusなどOmniのURLのOrganization名 |
OMNI_EMBED_SECRET |
Embed Secret | Settings > Embed > Admin で取得 |
OMNI_CONTENT_PATH |
埋め込むコンテンツのパス | /dashboards/12345678 |
OMNI_EXTERNAL_ID |
外部ユーザーID | user-001 |
OMNI_USER_NAME |
ユーザー表示名 | Demo User |
今回は以下のように入力しました。

この上で、uv run python app.pyを実行してアプリを立ち上げます。

その後にブラウザからhttp://localhost:8000/にアクセスすると、Omni上で作成したダッシュボードが特に認証を挟まずとも表示されました!

Omniのユーザー欄を確認してみると、Embedタブに新しいユーザーが作成されていました。今回はEmbedding用のユーザーには特にグループを割り当てておらず権限も付与していなかったのですが、Viewerの権限が付与されていました。(公式Docによると、コンテンツのパスがダッシュボードの場合Viewer権限が付与されるようです。)
また上述のViewer権限以外を付与する場合、Embedding時のOmniに対する権限はConnectionの画面で設定できるBasicアクセスロールが考慮されないため、Embedding用のユーザー作成時にconnectionRolesかgroupsの指定が必要となります。


AIチャット機能を埋め込んでみる
OmniのEmbedding機能は、Omniの画面上で使えるAIチャット機能も埋め込めるため、試してみます。
ConnectionのIDを確認
利用したいConnectionの画面で、Connection IDを確認します。

対象のModelでAIチャットで使用できるTopicを制限
AIチャットで使用可能とするTopicを制限します。
modelファイルで、下図のようにai_chat_topicsを入れて、AIチャットの利用対象とするTopicを入力します。

注意点としては、Topic名を日本語にしている場合、WorkbookのTopic編集画面で確認できるNameでai_chat_topicsに入れないといけないため、ご注意ください。

埋め込み用のパラメータの設定
これでOmni側の準備は完了のため、以下のリポジトリを使って埋め込みの設定をしていきます。
.envファイルを編集するだけでよいのですが、ポイントは以下2点です。
OMNI_CONTENT_PATH:/chatと入力OMNI_CONNECTION_ROLES:JSON形式で、{"<確認したConnection ID>":"RESTRICTED_QUERIER"}と入力


アプリを起動してAIチャット機能が埋め込まれているか確認
uv run python app.pyを実行してアプリを立ち上げて、その後にブラウザからhttp://localhost:8000/にアクセスすると、下図のようにAIチャット画面が埋め込まれて表示されました!

ちゃんと質問して、結果を得ることも出来ます。

より埋め込み先のデザインに併せて表示をカスタムしたい場合
OmniのダッシュボードやAIチャット機能を埋め込む際、そのデザインを埋め込み先に併せたいことがよくあると思います。
そんなときは、カスタムテーマ機能を用いたり、AIチャット機能のアイコンやプロンプトのプレースホルダーなどを変更することが可能です!
詳細は以下の公式Docよりご確認ください。
Embedユーザーのセッションを削除する
OmniのEmbedユーザーのセッションは、OmniのEmbed画面のAdminタブで設定した時間(デフォルトだと24時間)有効なのですが、Omniの画面上からセッションを削除することも可能です。
Embed画面のSessionsタブから、対象のセッションの横の「︙」を押してDelete Sessionを押せばOKです。
※Embedの検証を行っていると以前のセッションが悪影響を及ぼすことがあるので、個人的にこれはとてもありがたい機能です!

最後に
OmniのダッシュボードやAIチャット機能を提供するアプリに簡単に埋め込みできる、Standard SSOのEmbedding機能を試してみました。
OmniのEmbedding機能は、権限管理含めたユーザーの動的な作成ができるのが素晴らしいですね!AIチャット機能も簡単に埋め込めるため、提供しているアプリケーションのデータをユーザーに自由に自然言語で分析してもらうインターフェースもすぐに構築可能です。







