Discourse OpenID Connect (OIDC)

:discourse2: 概要 Discourse OpenID Connect を使用すると、OpenID Connect プロバイダーを Discourse の認証プロバイダーとして利用できます。
:open_book: インストールガイド このプラグインは 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 トークンから読み取り、ユーザーのグループメンバーシップを相应に更新します。グループ同期を有効にするには:

  1. アイデンティティプロバイダーを構成して、クレームのいずれかにグループの配列を返すようにします。これは文字列の配列である必要があります。

  2. openid_connect_groups_claim を、ユーザーのグループを含む OIDC トークンのクレーム名に設定します(例:cognito:groups)。設定すると、Discourse の「関連グループ」システムに情報が同期され始めます。

  3. 連携させたい Discourse グループを見つけます。「設定」→「メンバーシップ」→「自動」に移動し、連携させる関連グループを選択します。このドロップダウンリストはアイデンティティプロバイダーの情報で埋められるため、少なくとも 1 人のグループメンバーがログインしている場合にオプションが表示されます。

設定例

ここでは、Google の OpenID Connect プロバイダーに接続するための openid-connect プラグインを設定します。これは Discourse コアに既に存在する機能を再現するものですが、アクセスしやすい例として機能します。

  1. OpenID Connect  |  Sign in with Google  |  Google for Developers にアクセスし、OAuth 資格情報を取得する手順に従ってください。

  2. 同じページで、リダイレクト URI を追加する手順に従ってください。これは https://<your_forum>/auth/oidc/callback(末尾のスラッシュなし)である必要があります。

  3. 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(間にスペース)

  4. 完了です。「OpenID Connect でログイン」ボタンをクリックすると、Google を使用してログインできるようになります :tada:。これらの手順は、非常に最小限の変更で他のプロバイダーにも適用できます。

デバッグ

上記の 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
  1. https://developer.yahoo.com/apps にアクセスして、新しいアプリを作成してください

  2. アプリ名を入力し、コールバックドメインをフォーラムドメイン(例:meta.discourse.org)に設定してください

  3. API 権限の下で、Profiles: Read/Write Public and Private を選択してください。これがユーザーのメールアドレスを取得する方法として私が知っている唯一の方法です

  4. アプリを保存してください

  5. Discourse OIDC 設定で、発見ドキュメントを以下に設定してください

    https://login.yahoo.com/.well-known/openid-configuration
    
  6. Yahoo からのクライアント ID とシークレットを入力してください

  7. OIDC プラグインを有効にしてください

AWS Cognito
  1. Cognito に移動し、新しいユーザープールを選択または作成してください。
  2. App clients でアプリを定義してください。
  3. すべてデフォルトのままにしますが、Auth Flows Configuration を ALLOW_REFRESH_TOKEN_AUTH のみを選択するように変更してください。
  4. App client settings に移動し、新しいアプリを選択してください。
  5. コールバック URL を https://yoursite.example.com/auth/oidc/callback に変更してください。
  6. 「Allowed OAuth Flows」の中で、Authorization code grant flow のみをチェックしてください。
  7. 必要なすべてのスコープをチェックしてください(私はすべてチェックしています)。
Okta
  1. Discourse を Okta アプリのクライアント ID とシークレットで構成してください

  2. 発見ドキュメント URL を以下に設定してください

    https://{your-app}.okta.com/.well-known/openid-configuration
    
  3. Discourse で、openid connect authorize scopeopenid email に設定してください

:discourse2: 私たちがホストしていますか?このプラグインは、Business および Enterprise プランで利用可能です。OAuth 2.0 & OpenID Connect Support | Discourse - Civilized Discussion

:spiral_notepad: ユーザーのサインアップを自動化する必要がありますか?Auto-provisioning user accounts when SSO is enabled を参照してください


  1. トークンまたは userinfo ペイロード ↩︎

  2. トークンまたは userinfo ペイロードから ↩︎

「いいね!」 52
Native SSO with Azure AD
How to setup okta authentication with discourse
Discourse Login using external API
OpenIdAuthenticator plugin fails
Sign in to Discourse using ORCID
Discourse, Keycloak, SAML vs OAuth
OpenID Connect support in selfhosted Discourse instance
How can you connect firebase to discourse?
Keycloak SSO and logout issue
Tutorial for OpenID Connect / Azure AD
OpenID connect plugin
Azure OpenID Connect Authentication Plugin
Installing own gem in plugin
SSO Login page not showing up
Enabling Okta for employees only through OpenID Connect Authentication Plugin
Is "partial" SSO possible?
Auto-sign-in with the OpenId Connect Plugin and AWS Cognito
Official support for Microsoft Azure AD?
CodeBerg support
Availability of OpenID Connect in hosted plans
Can we use the default atlassian id to login to discourse
OpenIdAuthenticator plugin fails
Intergrate Discourse with keycloak
IndieAuth login
Intergrate Discourse with keycloak
Map oidc fields to custom user fields
CSRF problem in development with 'Discourse OpenID Connect' plug-in
Azure B2C SSO to Discourse?
User (patron) getting authorization error message
Memberstack + Webflow + Discourse OpenID Connect
How can add 2 or more discovery documents?
Memberstack + Webflow + Discourse OpenID Connect
Azure AD Authentication and Creation of User Account
Possible to create a Sign in with Ghost plugin for Discourse?
Custom Login Flow: AWS Cognito SSO (via Passwordless Signin) - Is this possible?
Account already in discourse
AAD integration with Discourse
Having trouble setting up AWS Cognito passwordless login
Discourse ID fails to activate on my instance
Restrict Office 365 Login to certain Group
OpenID Connect Plugin not creating new users with AWS Cognito
OIDC users not associating with existing Discourse users
Bundling more popular plugins with Discourse core
OpenID Connect Plugin Refactor (OIDC Implicit Flow)
Availability of OpenID Connect in hosted plans
How to configure the OIDC to set the Username as the email account name or a username like value returned from my auth providers?
Managing group membership via authentication
Failed to bootstrap due to out of memory killer
OAuth connection of discourse
Auto-provisioning user accounts when SSO is enabled
Anyone have a working AWS Cognito configuration w/ ouath2, openid or sso?
SAML Plugin on Self Hosted Discourse
Can I include website analytics in trust data?
Using OpenID Connect with User Flows in Azure B2C
ADFS Authentication
How to set-up Discourse with Atricore Josso CE
Error of Discourse OpenID Connect
How can add 2 or more discovery documents?
./launcher rebuild app fails hard 'bundle exec rake db:migrate' possible issue with github/master repo removal of auth/oath2_authenticator
Removing Yahoo login from Core, and deprecating OpenID 2.0
SSO with TownNews CMS
OpenID Connect Plugin Refactor (OIDC Implicit Flow)
OpenID with line.biz - email in JWT , missing in userinfo