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

こんにちは。
AWS上のDiscourseインスタンスでOpenID Connect認証プラグインを使用しています。
Discourse、Discourse Sidekiq、Redisのコンテナ(Bitnamiベースですが、どうか追い出さないでください ;))をデプロイしました。DBはAWS RDSで稼働しています。KeyCloakを使用しています。

動作はしています。

しかし、Discourse AWSタスクを再起動した後、キャッシュにDiscoveryドキュメントがあると認識しているのに、実際にはドキュメントが存在しないという状況が時々発生します。そして、KeyCloakから再取得しようとしません。

OIDC Log: Discovery document loaded from cache
OIDC Log: Discovery document is
---
(oidc) Request phase initiated.
(oidc) Authentication failure! openid_connect_discovery_error: OmniAuth::OpenIDConnect::DiscoveryError, Discovery document is missing

ブラウザアプリには、「IDプロバイダーから設定を取得できませんでした。もう一度お試しください。」と表示されます。

何かアドバイスはありますか?

「いいね!」 2

こんにちは。

Discourse のユーザーアバターソースを OpenID サービスで指定されたフィールドに設定する方法はありますか?

編集:Keycloak を使用しています。

「いいね!」 1

こんにちは。

Tomáš_Guba さんと同様の要件があります。ユーザープロファイル内のカスタムエントリから値を取得し、それを [custom] ユーザーフィールドで使用したいと考えています。

私の場合は、userinfo_endpoint を持つディスカバリー ドキュメントがあります。

プラグインのロードマップにそのようなものはありますか?

よろしくお願いします。

「いいね!」 1

こんにちは。プラグインをSSO OpenIDで動作させることができましたが、他のシステムのユーザー名フィールドやメールアドレスなどのフィールドには入力されません。

「openid connect claims」フィールドで何かを設定する必要があると思いますが、このフィールドを直接設定する方法がわかりません。例を教えていただけますか?私のプロジェクトのスクリーンショットをいくつか紹介します。
https://imgur.com/gallery/LWvkJUV

「いいね!」 1

プライベート投稿にログインする際に、元のルートを「失う」のを避ける方法はありますか?

プライベートページにアクセスし、そのページにあるログインボタンのいずれかをクリックすると、サイトにリダイレクトされたときにカテゴリページにたどり着きます。

こんにちは @david さん、

以下の投稿で言及されている問題を確認していただけますでしょうか? OAuth basic の代わりに OIDC プラグインを使用したいのですが、同様の問題が発生しています。/authorize リクエストにパラメータを渡すことができません。プラグインに foo=bar の形式で値を入力しました。

LinkedInでこれを機能させることができませんでした。他の誰かが試したことがありますか?「サインイン…」ボタンをクリックしてLinkedInにリダイレクトされた後、LinkedInにログインし、アプリがLinkedInから私のメールを使用することを「許可」すると、「申し訳ありませんが、アカウントの承認中にエラーが発生しました。もう一度お試しください。」というメッセージが表示されます。

https:/discourse.mysite.com/auth/failure?message=invalid_credentials&origin=https%3A%2F%2Fdiscourse.mysite.com%2F&strategy=oidc

これでもまだ問題があります。次のエラーが表示されます。

(oidc) Authentication failure! invalid_credentials: OAuth2::Error, invalid_request: A required parameter "client_secret" is missing {"error":"invalid_request","error_description":"A required parameter

これはomniauthのエラーで、おそらくこれに関連しているようです: No longer works with oauth2 gem v2.0+ · Issue #68 · decioferreira/omniauth-linkedin-oauth2 · GitHub

助けていただけると幸いです!

エラーが発生しています。


(oidc) 認証失敗! openid_connect_discovery_error: OmniAuth::OpenIDConnect::DiscoveryError, Discovery document is missing

OIDC ログ: Discovery document の取得中にエラーが発生しました Faraday::ConnectionFailed FinalDestination: lookup failed

管理設定で「openid connect discovery document」を https://<auth_provider>/.well-known/openid-configuration に設定しており、これは実行中のアプリのDockerコンテナ内でCurlコマンドやRailsコンソールから正常にアクセスできます。

なぜこれらのエラーが発生するのか、何か考えはありますか?このせいで正しく統合できません。また、イントラネットの後ろにいて、会社のプロキシを使用しています(もしそれが役立つなら)。コンテナのENVでプロキシを有効にすると、「openid connect discovery document」URLに正常にアクセスできます。

「いいね!」 1

2件の投稿が新しいトピックに分割されました: 複数のOIDCソースを許可する

投稿が新しいトピックに分割されました:OIDCを使用したアバターの上書き

こんにちは!

新しい質問です。このプラグインはセッション管理を扱いますか? (Final: OpenID Connect Session Management 1.0)。
OPがsession_stateデータを送信したとしても、コードのどこにもクッキーとして保存されている箇所が見当たらないため、そうではないと思います。

これは質問/機能リクエストです :slight_smile: 素晴らしいものになるでしょう!

「いいね!」 2

このプラグインをAWS Cognitoで使用する場合、ログアウト時にCognitoはログアウトURLにclient_idパラメータを渡す必要があります。私の知る限り、ログアウトURLに追加のクエリパラメータを追加する方法はありません。これは正しいですか?もしそうでない場合、この機能を追加することは可能ですか?

皆さん、こんにちは :wave:t3:

このプラグインの拡張機能(技術的にはテーマ/コンポーネントの形式)を作成しました。これは、ログインポップアップの「OIDC経由でログイン」ボタンを非表示にし、代わりに特別なURLにアクセスすることでログインフローを開始するものです。

discourse-autooidc.zip (1.0 KB)

この機能のユースケースは、会社のメンバーに安全で便利な(自動的な)OAuth経由のログインを提供することです。公開されているOAuthプロバイダーへのリンク(この場合はAuthentikですが、Authelia、Keycloak、Auth0、Oktaなどでも機能するはずです)を公開することなく、また、決して使用できない、または使用すべきでないログイン via oidc ボタンで他のすべてのユーザーを煩わせることなく実現します。

OIDC経由でログインするには、https://<your-discourse-base-url>/login#autooidc を呼び出すだけです。

「いいね!」 3

GitHub - discourse/discourse-hide-auth-method: A theme component which allows hiding a specific login method from the UI, without fully disabling it は同様のことを行っているので、興味があるかもしれません。

「いいね!」 3

Keycloak は Backchannel logout URL をサポートしています。

このレルム(end_session_endpoint 経由)にログアウトリクエストが送信されたときに、クライアントが自身をログアウトさせる URL。省略された場合、このケースではクライアントにログアウトリクエストは送信されません。

このプラグインが、Keycloak からペイロードを受け入れて、すぐに一部のユーザーをすべてのセッションからログアウトさせるエンドポイントを公開してくれると素晴らしいです。そうでない場合、Keycloak でユーザーを無効にした場合、maximum session age(デフォルトでかなり大きい)を待つ必要があります。

ユーザーの管理者ページ(例:/admin/-1/system)からすべてのセッションからログアウトさせることもできます。ページ上部にある「ログアウト」ボタンをクリックしてください。

こんにちは。

ディスカバリー ドキュメントの取得に失敗した場合(タイムアウトなど)、プラグインはエラーをキャッシュします。これは、認証が10分間利用できないことを意味します。エラーをキャッシュしないようにして、より早く再試行できるようにすることは可能ですか?

よろしく

お手数おかけして申し訳ありませんが、PKCEサポートを追加するための簡単なマージで済むオープンなPRがあります。

@nbianca リポジトリの最新のコミッターであることに気づきました。もしよろしければ、ご確認いただけますでしょうか? :folded_hands:

「いいね!」 1