メインコンテンツまでスキップ

オンプレミス環境のシングルサインオン

このページは、オンプレミスのMonoChat環境を運用する管理者向けです。OpenID Connect(OIDC)を使い、社内のIDプロバイダー(IdP)でスタッフがサインインできるようにする方法を説明します。たとえばMicrosoft Entra ID、Okta、Keycloak、AD FS、Google Workspaceです。

シングルサインオンは、ワークスペースごとではなく、サーバー設定でインストール全体に対して設定します。MonoChatのアカウントは複数のワークスペースに所属でき、ワークスペースを選ぶ前にサインインします。サインインで得られるのはアカウントであり、アクセス権ではありません。ワークスペースが招待してロールを付与するまで、その人にはそのワークスペースは表示されません。

サインインの仕組み​

サインインページでSSOボタンをクリックすると、MonoChatはIdPのサインインページをポップアップで開きます。そこでサインインすると、IdPは一度だけ使えるコードを付けてブラウザーをMonoChatに戻します。MonoChatサーバーはそのコードをIDトークンと交換し、検証してからサインインさせます。

  • IdPのエンドポイントと署名鍵は、サインインのたびにディスカバリードキュメント <issuer>/.well-known/openid-configuration から読み込まれます。
  • サインインには、PKCE(S256)、state、nonce を使った認可コードフローを使用します。サインインリクエストの有効期間は10分で、1回だけ使用できます。
  • IDトークンはIdPの鍵のいずれかで署名され、issuer(iss)、クライアントID(aud)、リクエストの nonce、期限切れでない有効期限(exp)を含んでいる必要があります。
  • IDトークンには本人のメールアドレス(email)が含まれている必要があります。IdPがアドレスを未確認(email_verified: false)としている場合、サインインは拒否されます。

1. IDプロバイダーにMonoChatを登録する​

IdPで、次の値を使ってMonoChat用のアプリケーション(クライアント)を作成します。

IdPでの設定値
アプリケーションの種類クライアントシークレットを持つWebアプリケーション(コンフィデンシャルクライアント)
サインインのリダイレクトURIhttps://<your MonoChat domain>/api/oauth/oidc/redirect
グラントタイプ認可コード(Authorization code)
スコープopenid email profile
トークンエンドポイントでのクライアント認証HTTP Basic認証で送信するクライアントシークレット(client_secret_basic)

IDトークンに email クレームが含まれるようにしてください。クライアントID、クライアントシークレット、issuerを控えておきます。issuerは、IdPのディスカバリードキュメントにある issuer の値です。一般的な形式:

IDプロバイダーIssuer
Microsoft Entra IDhttps://login.microsoftonline.com/<tenant id>/v2.0
Oktahttps://<your Okta domain>/oauth2/default、またはhttps://<your Okta domain>
Keycloakhttps://<your Keycloak host>/realms/<realm>
AD FS(2016以降)https://<your AD FS host>/adfs
Google Workspacehttps://accounts.google.com

ブラウザーで <issuer>/.well-known/openid-configuration を開き、issuer の値を、末尾に / があればそれも含めて正確にコピーしてください。両者が異なると、MonoChatは誰もサインインさせません。

2. 設定を追加する​

サーバー設定に oidc ブロックを追加し、MonoChatを再起動します。公開ブロックは public.oauth の下に、秘密ブロックは oauth の下に置きます。

{
"oauth": {
"oidc": {
"clientSecret": "<client secret>",
"autoCreateAccounts": true,
"allowedEmailDomains": ["company.com"]
}
},
"public": {
"oauth": {
"oidc": {
"issuer": "https://login.microsoftonline.com/<tenant id>/v2.0",
"clientId": "<client id>",
"redirectPath": "/api/oauth/oidc/redirect",
"scope": "openid email profile",
"buttonLabel": "Sign in with Company SSO"
}
}
}
}
設定内容
public.oauth.oidc.issuer手順1のissuer
public.oauth.oidc.clientId手順1のクライアントID
public.oauth.oidc.redirectPath手順1のリダイレクトURIのパス
public.oauth.oidc.scopeMonoChatが要求するスコープ
public.oauth.oidc.buttonLabelサインインボタンのテキスト。空の場合は本人の言語で「SSOでサインイン」と表示されます
oauth.oidc.clientSecretクライアントシークレット。サーバーに保持されます
oauth.oidc.autoCreateAccountstrue にすると、サインアップが招待制(public.disableSignup)でも、初回のSSOサインイン時にMonoChatアカウントを作成します
oauth.oidc.allowedEmailDomainsメールアドレスがこれらのドメインのいずれかにある人だけがSSOでサインインできます。すべてのドメインを許可する場合は指定しません

これで、サインインページにSSOボタンが表示されます。

サインインできる人​

  • 新しい人。 autoCreateAccounts: true の場合、初回のSSOサインインでアカウントが作成されます。設定しない場合、アカウントが作成されるのは public.disableSignup がオフのとき、または招待からサインインしたときだけです。
  • 同じメールアドレスのアカウントをすでに持つ人。 oauth.autoMerge: true の場合、初回のSSOサインインで既存のアカウントにSSOが紐付けられます。ただし、IDトークンでアドレスが確認済み(email_verified: true)とされている場合に限ります。それ以外の場合や autoMerge を設定しない場合、MonoChatは一度パスワードでサインインするよう求め、そのときにSSOをアカウントに紐付けます。ワークスペースへの招待を承諾したときにも紐付けられます。Microsoft Entra IDとAD FSは email_verified を送信しないため、これらを使う場合は、全員がSSOを紐付けるまでパスワードでのサインインを許可したままにするか、改めて招待してください。
  • 許可するドメイン。 allowedEmailDomains を設定すると、ほかのドメインのアドレスは拒否されます。Google Workspace(issuer https://accounts.google.com)では、個人のGoogleアカウントでも任意のドメインのアドレスを使えるため、MonoChatはメールアドレスではなく、アカウントのWorkspaceドメインである hd クレームを確認します。

SSOを唯一のサインイン方法にする​

  1. public.auth.methods を ["oidc"] に設定します。サインインページにはSSOボタンだけが表示され、サーバーはパスワードとソーシャルのサインインを拒否します。
  2. root superユーザー(ルートワークスペースでroot superロールを持つユーザー)は、引き続き /auth/signin?fallback=1 でパスワードを使ってサインインできるため、IdPが停止してもインストールが締め出されることはありません。
  3. 新しいSSOアカウントが独自のワークスペースを作成できないようにするには、public.disableTenantCreation を true に設定します。その後は、ワークスペースで適切なロールを持つ人だけが、その配下にワークスペースを作成できます。

ネットワーク​

  • /api/oauth/oidc/authorize と redirectPath は、サインインする人がアクセスできるようにしておいてください。どちらもその人のブラウザーで開かれます。
  • MonoChatサーバーは、IdPのディスカバリードキュメント、トークンエンドポイント、鍵セット(jwks_uri)にHTTPSで到達できる必要があります。

制限事項​

  • MonoChatモバイルアプリはまだSSOに対応していません。SSOを唯一のサインイン方法にすると、エージェントはモバイルアプリにサインインできません。
  • MonoChatからサインアウトしてもIdPからはサインアウトされず、IdPからサインアウトしてもまだMonoChatからはサインアウトされません。

設定を確認する​

  1. サインインページを開き、SSOボタンをクリックします。IdPでサインインすると、ポップアップが閉じてMonoChatにサインインした状態になります。
  2. まだMonoChatアカウントを持たない人でサインインし、アカウントが作成されること(autoCreateAccounts をオンにしていない場合は拒否されること)を確認します。
  3. allowedEmailDomains を設定した場合は、別のドメインの人で試し、サインインが拒否されることを確認します。
  4. public.auth.methods を設定した場合は、パスワードでのサインインが拒否され、root superユーザーが /auth/signin?fallback=1 で引き続きサインインできることを確認します。