| 概要 | Discourse OpenID Connect を使用すると、OpenID Connect プロバイダーを Discourse の認証プロバイダーとして利用できます。 | |
| インストールガイド | このプラグインは Discourse コアにバンドルされています。別途プラグインをインストールする必要はありません。 |
機能
このプラグインは、仕様 の最小限の実装を提供することを目指しています。具体的には、「Authorization Code Flow」をサポートしています。開始するには、プラグインのインストール手順 に従うか、ホスティングプロバイダーに連絡してください。
oauth2-basic プラグインを使用すると、一部の OpenID Connect プロバイダーへの接続が可能です(OpenID Connect は OAuth2 に基づいています)。ただし、このプラグインははるかに少ない手動設定で動作し、JSON API が利用できない場合でも JWT の「ID Token」を利用できます。
設定は、OpenID Connect 発見ドキュメント を使用して自動的に実行されます。仕様によると、これは通常 <issuer domain>/.well-known/openid-configuration に配置されますが、Discourse は非準拠の実装(例:Azure B2C)に対応できるよう、任意のパスをサポートしています。発見ドキュメントはパフォーマンス向上のため 10 分間キャッシュされます。
発見ドキュメントに userinfo_endpoint パラメータが含まれている場合、プラグインはユーザーメタデータを収集するためにそれを使用します。含まれていない場合は、トークンエンドポイントから提供される id_token(JWT)からメタデータを抽出します。プラグインは JWT サイニャの真正性を検証しません。これは複雑さを大幅に増加させるためです。この決定は、仕様 によって支持されています。
ID トークンがクライアントとトークンエンドポイント間の直接通信(このフローではそうである)を介して受信される場合、トークンの署名を確認する代わりに、TLS サーバー検証を使用して発行者を検証してもよい(MAY)。
「PKCE を用いた Authorization Code Flow」 によるシークレットなし認証をサポートするアイデンティティプロバイダーの場合、PKCE を有効にし、client_secret 設定を省略できます。
設定
基本設定オプション
-
openid_connect_enabled:OpenID Connect 認証を有効にする -
openid_connect_discovery_document: OpenID Connect 発見ドキュメントの URL。通常https://your.domain/.well-known/openid-configurationに配置されます -
openid_connect_client_id: OpenID Connect クライアント ID -
openid_connect_client_secret: OpenID Connect クライアントシークレット -
openid connect rp initiated logout: ログアウト後にユーザーをend_session_endpointにリダイレクトします。アイデンティティプロバイダーがこれをサポートし、発見ドキュメントに含まれている必要があります。 -
openid connect rp initiated logout redirect: (オプション)ログアウトエンドポイントに渡されるpost_logout_redirect_uri。指定された場合は、アイデンティティプロバイダーに登録されている必要があります。 -
openid_connect_authorize_scope: 認可エンドポイントに送信されるスコープ。これには ‘openid’ を含める必要があります -
openid_connect_use_pkce: OpenID Connect 認証に対して PKCE(Proof Key for Code Exchange)を有効にする -
openid_connect_verbose_logging:/logsに詳細な openid-connect 認証情報をログ出力します。通常の使用時にはこれを無効にしてください。
高度な設定オプション
-
openid_connect_token_scope: トークンエンドポイントを要求する際に送信されるスコープ。公式仕様ではこれは必須ではありません。 -
openid_connect_error_redirects: コールバックのerror_reasonに最初のパラメータが含まれている場合、ユーザーは 2 番目のパラメータの URL にリダイレクトされます。ユーザー入力に対するエラー応答を送信する特殊な実装(例:Azure B2C)に使用されます。 -
openid_connect_allow_association_change: ユーザーが Discourse アカウントを OpenID Connect プロバイダーから切断して再接続できるようにする
-
openid_connect_groups_claim: ユーザーのグループを文字列の配列として含む OIDC 応答[1] 内のクレーム名。グループ同期を無効にする場合は空白のままにします。詳細は後述の グループ同期 を参照してください。 -
openid_connect_user_field_mappings: Discourse ユーザーフィールドに保存される OIDC クレーム[2] のマッピング。ユーザーフィールドは数値 ID で識別され、管理パネルから編集する際の URL に表示されます。
グループ同期
このプラグインは、OpenID Connect プロバイダーからのグループメンバーシップを自動的に Discourse グループに同期できます。各ログイン時に、プラグインは設定されたクレームを OIDC トークンから読み取り、ユーザーのグループメンバーシップを相应に更新します。グループ同期を有効にするには:
-
アイデンティティプロバイダーを構成して、クレームのいずれかにグループの配列を返すようにします。これは文字列の配列である必要があります。
-
openid_connect_groups_claimを、ユーザーのグループを含む OIDC トークンのクレーム名に設定します(例:cognito:groups)。設定すると、Discourse の「関連グループ」システムに情報が同期され始めます。 -
連携させたい Discourse グループを見つけます。「設定」→「メンバーシップ」→「自動」に移動し、連携させる関連グループを選択します。このドロップダウンリストはアイデンティティプロバイダーの情報で埋められるため、少なくとも 1 人のグループメンバーがログインしている場合にオプションが表示されます。
設定例
ここでは、Google の OpenID Connect プロバイダーに接続するための openid-connect プラグインを設定します。これは Discourse コアに既に存在する機能を再現するものですが、アクセスしやすい例として機能します。
-
OpenID Connect | Sign in with Google | Google for Developers にアクセスし、OAuth 資格情報を取得する手順に従ってください。
-
同じページで、リダイレクト URI を追加する手順に従ってください。これは
https://<your_forum>/auth/oidc/callback(末尾のスラッシュなし)である必要があります。 -
Discourse サイトの設定に移動し、「openid_connect」を検索してください。
-
openid connect enabled: [x] -
openid connect discovery document:https://accounts.google.com/.well-known/openid-configuration -
openid connect client id:<client-id> -
openid connect client secret:<client-secret> -
openid connect authorize scope:
openid email(間にスペース)
-
-
完了です。「OpenID Connect でログイン」ボタンをクリックすると、Google を使用してログインできるようになります
。これらの手順は、非常に最小限の変更で他のプロバイダーにも適用できます。
デバッグ
上記の verbose_logging 設定に加えて、data-explorer プラグインを使用して OIDC 関連のデータにアクセスできます。
SELECT user_id, provider_name, provider_uid
FROM user_associated_accounts
WHERE provider_name = 'oidc'
または Rails コンソールで:
User.find_by_username("david").user_associated_accounts.where(provider_name: 'oidc')
プロバイダー固有の注意事項
この統合に関連するプロバイダー固有の癖を見つけた場合は、自由に更新してください。
Entra ID(旧 Azure AD)
email スコープを追加し、バージョン 2 のエンドポイント設定ドキュメントを使用していることを確認してください。例:
https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration
Azure B2C
発見ドキュメント URL の詳細は、こちらにあります:Web sign in with OpenID Connect - Azure AD B2C | Microsoft Learn
メールを機能させるには:
Yahoo
-
https://developer.yahoo.com/apps にアクセスして、新しいアプリを作成してください
-
アプリ名を入力し、コールバックドメインをフォーラムドメイン(例:
meta.discourse.org)に設定してください -
API 権限の下で、Profiles: Read/Write Public and Private を選択してください。これがユーザーのメールアドレスを取得する方法として私が知っている唯一の方法です
-
アプリを保存してください
-
Discourse OIDC 設定で、発見ドキュメントを以下に設定してください
https://login.yahoo.com/.well-known/openid-configuration -
Yahoo からのクライアント ID とシークレットを入力してください
-
OIDC プラグインを有効にしてください
AWS Cognito
- Cognito に移動し、新しいユーザープールを選択または作成してください。
- App clients でアプリを定義してください。
- すべてデフォルトのままにしますが、Auth Flows Configuration を
ALLOW_REFRESH_TOKEN_AUTHのみを選択するように変更してください。 - App client settings に移動し、新しいアプリを選択してください。
- コールバック URL を
https://yoursite.example.com/auth/oidc/callbackに変更してください。 - 「Allowed OAuth Flows」の中で、Authorization code grant flow のみをチェックしてください。
- 必要なすべてのスコープをチェックしてください(私はすべてチェックしています)。
Okta
-
Discourse を Okta アプリのクライアント ID とシークレットで構成してください
-
発見ドキュメント URL を以下に設定してください
https://{your-app}.okta.com/.well-known/openid-configuration -
Discourse で、
openid connect authorize scopeをopenid emailに設定してください
私たちがホストしていますか?このプラグインは、Business および Enterprise プランで利用可能です。OAuth 2.0 & OpenID Connect Support | Discourse - Civilized Discussion
ユーザーのサインアップを自動化する必要がありますか?Auto-provisioning user accounts when SSO is enabled を参照してください
