jakeols
(Jake)
1
皆様、こんにちは
現在の環境に、別の Discourse コミュニティを追加することの可否について情報を探しています。現在は、WordPress マルチサイト構成で、Discourse SSO を使用して Discourse コミュニティ専用のサイトを運用しており、WP ログインには別の SSO プロバイダーを使用しています。
新しい Discourse コミュニティ用の WP サイトを追加したいと考えていますが、このマルチサイト構成内で複数の Discourse フォーラムを統合できるかどうか(もし可能であれば)が不明です。SSO は WP ネットワーク設定であるため、Discourse インスタンスを複数持つことはできないように思われます。
理想的には以下のような構成を望んでいます:
- WordPress マルチサイト
- Discourse インスタンス 2 つ
(両方の Discourse インスタンス間のユーザーは、自分が所属するコミュニティのみへのアクセス権を持つ必要があります)。
マルチサイト WP 構成とシングルサイト Discourse(またはその逆)に関する投稿は読んだことがありますが、マルチサイト WP と複数の Discourse インスタンスに関する情報は見当たりませんでした。
よろしくお願いいたします
「いいね!」 3
simon
2
WordPress のマルチサイト設定上で、複数のサイトが 2 つの Discourse インスタンスの SSO プロバイダーとして機能することはできません。その理由は、マルチサイトネットワークではすべてのユーザーが単一のデータベーステーブルに保存されるためです。ネットワーク内の複数のサイトに対して複数の Discourse サイトを SSO プロバイダーとして機能させる場合、WordPress に保存される Discourse ユーザー ID が一意であることを保証する明確な方法が存在しません。
「いいね!」 3
jakeols
(Jake)
3
ありがとうございます。私の推測が正しかったですね。1 つの Discourse インスタンスをもう 1 つのインスタンスの SSO プロバイダーとして機能させつつ、それぞれのコミュニティに対する適切なユーザーアクセスを維持することは可能でしょうか?
「いいね!」 1
simon
4
Discourse インスタンスは、他の Discourse インスタンスの SSO プロバイダーとして機能できます。あなたが想定している設定は、WordPress を Discourse インスタンス 1 の SSO プロバイダーとし、Discourse インスタンス 1 を Discourse インスタンス 2 の SSO プロバイダーとするものだと推測します。これは可能だと思いますが、Discourse サイトを SSO クライアントと SSO プロバイダーの両方として設定した経験はありません。
上記の設定では、Discourse インスタンス 1 のすべてのユーザーが Discourse インスタンス 2 へアクセスできてしまいます。それはあなたが望んでいることではないと思います。
この問題に対する別のアプローチとして、Discourse インスタンスを 1 つだけ使用し、カテゴリグループ権限を利用してユーザーがアクセスできるフォーラムの部分を制限する方法があります。SSO ペイロードに Discourse グループを渡すことができます。WordPress サイトで、ユーザーがアクセスできるサイトを判断することは可能でしょう。WordPress サイトごとに Discourse グループを作成し、wpdc_sso_params フィルターを使用して SSO ペイロードに add_groups パラメータを追加することが考えられます。
「いいね!」 3
jakeols
(Jake)
5
現在、Discourse SSO が SSO プロバイダーとして機能しています。新しい検討事項としては、インスタンス 1 を SSO プロバイダー(インスタンス 1 および 2 の両方に対して)として設定することが考えられます。
つまり、現在の SSO 設定を維持しつつ、別の Discourse インスタンスを追加し、インスタンス 1 とインスタンス 2 の間のアクセスを制限する方法を確保するというものです。
「いいね!」 1
jakeols
(Jake)
6
@simon さん、こんにちは。現在これを実装しているのですが、WP Discourse プラグインに SSO クライアントのオプションが表示されない理由がわかりません。以下のスクリーンショットをご覧ください。
接続はアクティブであると表示されています(API キーの最終使用履歴からも確認できます)。[discourse_sso_client] ショートコードを追加すると、設定に問題があるようです(Location 応答ヘッダーには、SSO ペイロードの代わりに、[discourse_sso_client] ショートコードによって生成された URL が含まれています)。
simon
7
これは仕様によるものです。SSO クライアントのオプションは、サイト全体で設定されているマルチサイトネットワークでのみ利用可能です。ローカルの開発環境でマルチサイトネットワークをセットアップし、設定を再確認する必要があります。本日中に改めてご連絡いたします。
「いいね!」 3
jakeols
(Jake)
8
ありがとうございます。現在、ネットワークレベルでプラグインをインストールし、SSO クライアントを選択しています。
編集: 問題の原因を query-redirect.php の以下の部分まで特定しました。
if ( empty( $this->options['sso-client-enabled'] ) || 1 !== intval( $this->options['sso-client-enabled'] ) ) {
return;
}
このオプションが正しく設定されていないようです。ネットワークレベルの設定が原因なのか、それとも他の要因なのかはわかりません。
simon
9
マルチサイトネットワークでのプラグイン設定に関するドキュメントが最新ではありません。これを機会に整理し、WP Discourse プラグインのインストールとセットアップ ガイドを更新しましょう。
マルチサイトネットワークで SSO クライアント機能を使用するには、プラグインをネットワークレベルで設定する必要があります。これは、ネットワークダッシュボードにある Discourse リンクをクリックすることで実行します。
Discourse ネットワークページで、「Enable Multisite Configuration」オプションを選択します。次に、「Connection Settings」セクションに Discourse の URL、API キー、および投稿用ユーザー名を入力します。ページの下までスクロールして「Save Options」ボタンをクリックします。ページ上部に「You are connected to Discourse!」というメッセージが表示されるはずです。
マルチサイトネットワーク上のサイト向けに Discourse を SSO プロバイダーとして使用するには、Discourse ネットワークページの下部までスクロールし、「Enable SSO Client」オプションを選択します。また、「SSO Secret Key」設定にキーを追加してください。オプションを再度保存します。
次に、Discourse サイトに移動し、シークレットキーを Discourse の sso provider secrets サイト設定にコピーします。SSO プロバイダードメインには * 記号を入力します。この設定が保存されると、以下のように表示されます。
Discourse で enable sso provider オプションを選択します。
これらの設定が完了すると、ネットワーク上の任意のサイトの WP Discourse SSO / SSO クライアントタブに移動すると、以下のようなページが表示されます。
簡単なテストとして、「Add Login Link」と「Sync Existing Users by Email」オプションを選択します。次に、WordPress サイトからログアウトしてください。wp-login.php ページに表示される「Login with Discourse」リンクをクリックすることで、再度ログインできるはずです。
デフォルトの WordPress ログインページを使用していない場合は、[discourse_sso_client] ショートコードをサイトの投稿にコピーしてみてください。このショートコードは、ログアウトしたユーザーに対してのみページ上にマークアップを表示します。また、以下のような形式でリンクを構築することでログインリンクを作成することもできます。
<a href="https://example.com/?discourse_sso=1&redirect_to=https://example.comt/">Log in with Discourse</a>
これにより、ユーザーは Discourse を介してサイトにログインし、その後 redirect_to パラメータの値として設定した WordPress ページにリダイレクトされます。
デバッグの結果、Discourse ネットワークページで「Enable SSO Client」オプションが有効になっていなかったようです。このオプションが有効になっているか確認し、引き続き問題が発生する場合はお知らせください。
SSO クライアントの動作を妨げていたコードは正しいですが、条件式が不適切に記述されています。
if ( empty( $this->options['sso-client-enabled'] ) || 1 !== intval( $this->options['sso-client-enabled'] ) )
これは if ( empty( $this->options['sso-client-enabled'] ) ) に簡略化すべきです。これはプラグインの他の場所でも使用されているパターンです。
「いいね!」 3