オンプレミス環境のシングルサインオン
このページは、オンプレミスの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アプリケーション(コンフィデンシャルクライアント) |
| サインインのリダイレクトURI | https://<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 ID | https://login.microsoftonline.com/<tenant id>/v2.0 |
| Okta | https://<your Okta domain>/oauth2/default、またはhttps://<your Okta domain> |
| Keycloak | https://<your Keycloak host>/realms/<realm> |
| AD FS(2016以降) | https://<your AD FS host>/adfs |
| Google Workspace | https://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.scope | MonoChatが要求するスコープ |
public.oauth.oidc.buttonLabel | サインインボタンのテキスト。空の場合は本人の言語で「SSOでサインイン」と表示されます |
oauth.oidc.clientSecret | クライアントシークレット。サーバーに保持されます |
oauth.oidc.autoCreateAccounts | true にすると、サインアップが招待制(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(issuerhttps://accounts.google.com)では、個人のGoogleアカウントでも任意のドメインのアドレスを使えるため、MonoChatはメールアドレスではなく、アカウントのWorkspaceドメインであるhdクレームを確認します。
SSOを唯一のサインイン方法にする
public.auth.methodsを["oidc"]に設定します。サインインページにはSSOボタンだけが表示され、サーバーはパスワードとソーシャルのサインインを拒否します。- root superユーザー(ルートワークスペースでroot superロールを持つユーザー)は、引き続き
/auth/signin?fallback=1でパスワードを使ってサインインできるため、IdPが停止してもインストールが締め出されることはありません。 - 新しいSSOアカウントが独自のワークスペースを作成できないようにするには、
public.disableTenantCreationをtrueに設定します。その後は、ワークスペースで適切なロールを持つ人だけが、その配下にワークスペースを作成できます。
ネットワーク
/api/oauth/oidc/authorizeとredirectPathは、サインインする人がアクセスできるようにしておいてください。どちらもその人のブラウザーで開かれます。- MonoChatサーバーは、IdPのディスカバリードキュメント、トークンエンドポイント、鍵セット(
jwks_uri)にHTTPSで到達できる必要があります。
制限事項
- MonoChatモバイルアプリはまだSSOに対応していません。SSOを唯一のサインイン方法にすると、エージェントはモバイルアプリにサインインできません。
- MonoChatからサインアウトしてもIdPからはサインアウトされず、IdPからサインアウトしてもまだMonoChatからはサインアウトされません。
設定を確認する
- サインインページを開き、SSOボタンをクリックします。IdPでサインインすると、ポップアップが閉じてMonoChatにサインインした状態になります。
- まだMonoChatアカウントを持たない人でサインインし、アカウントが作成されること(
autoCreateAccountsをオンにしていない場合は拒否されること)を確認します。 allowedEmailDomainsを設定した場合は、別のドメインの人で試し、サインインが拒否されることを確認します。public.auth.methodsを設定した場合は、パスワードでのサインインが拒否され、root superユーザーが/auth/signin?fallback=1で引き続きサインインできることを確認します。