WordPress SSO および Patreon ログイン

こんにちは!質問があります。私のクライアントが、Patreon からの会員管理を徐々に WordPress(WooCommerce Memberships を経由)へ移行したいと考えています。他のフォーラムの投稿から、これは可能だと承知しています。

ただし、質問は、WordPress をプロバイダーとして SSO を有効にした場合、フォーラムへのログイン方法が WordPress のみになるのかどうかです。WordPress との SSO を有効にすると、Patreon ユーザーが Patreon アカウントでログインできなくなるのでしょうか?それとも、両方を併用することは可能でしょうか?

混乱を招く質問で、あるいは不適切な場所で聞いてしまったらすみません。

よろしくお願いいたします!

はい、SSO の最初の S は「Single(単一)」を意味します。これにより、WordPress がすべての認証の権限を持つようになります。

ただし、Patreon がユーザーのメールアドレスを提供している場合、ユーザーは同じメールアドレスを使用することで、WordPress に登録してアカウントにアクセスし直すことができます。

WordPress サイトへのログインを Patreon を通じて可能にするには、Patreon WordPress – WordPress plugin | WordPress.org のプラグインを使用することもできます。これは未検証ですが、Patreon 経由で WordPress にログインしつつ、WordPress と Discourse 間のシングルサインオン(SSO)を維持することが可能であるはずです。試してみて動作に問題がある場合は、お知らせください。

こんにちは!この設定を試してみたところ、基本的には問題なく動作しました!:slight_smile:
唯一の課題は、ログインが成功した後、Discourse へリダイレクトされず、WordPress へ戻ってしまう点です。ユーザーは手動で Discourse に移動し、再度「ログイン」ボタンを押して登録を完了する必要があります。この問題を何かしら解決できるでしょうか?

動作を動画で撮影しましたので、ご覧ください。

お試しいただきありがとうございます。Discourse へのログインに必要な SSO パラメータが、Patreon のログイン処理中に削除されているようです。その場合、この問題を解決する方法は恐らくないでしょう。

不思議ですが、WordPress-Patreon プラグインを変更することで修正できるでしょうか?著者に連絡する価値はあるでしょうか?:slight_smile:

問題の原因が私の推測通りであれば、WordPress Patreon プラグインを変更することで解決できる可能性があります。私が問題の原因だと考えているのは、WordPress Patreon プラグインが Patreon ログインリクエストと一緒に送信される sso および sig クエリパラメータを削除してしまっていることです。この問題について、プラグインの開発者に連絡してみる価値があるかもしれません。

その前に、現在 WordPress にログインしていないユーザーが Discourse の「ログイン」ボタンをクリックすると、ユーザーが WordPress のログインページに移動することを確認してください。その後、ユーザーが Patreon ログインオプションを選択すると、WordPress にはログインしますが、Discourse にはログインされません。Discourse サイトが非公開に設定されている場合、ユーザーが直接 Discourse サイトにアクセスした際にも上記の動作が発生します。その場合、ユーザーは Discourse 上に「ログイン」ボタンを見ることができません。

こんにちは!Patreon プラグインの開発者にレポートを提出しました - Redirecting not working when using together with Discourse SSO - Wordpress Plugin - Patreon Developers

はい、確認できます:

  • 現在 WordPress にログインしていないユーザーがDiscourseの「ログイン」ボタンをクリックすると、WordPress のログインページにリダイレクトされる - :white_check_mark: はい
  • その後、ユーザーが Patreon ログインオプションを選択すると、WordPress にログインする - :white_check_mark: はい
  • しかし、Discourse にはログインしない - :white_check_mark: はい - 上記の動画の 0:32 で、ユーザーがログインしていないことが確認できます。

はい、Patreon ログインの問題を「解決」する回避策を見つけました。手順は以下をご覧ください。:slight_smile:

必要なもの:

  • ログインフォームを表示するためのショートコードを提供する任意のプラグイン(私のサイトには WooCommerce がインストールされているため、未ログインユーザーに対してまさにこれを行う [woocommerce_my_account] ショートコードを使用しました)。
  • ユーザーのログイン状態に応じてコンテンツの表示/非表示を切り替える [members_logged_in] および [members_not_logged_in] ショートコードを提供する Members プラグイン。同様のショートコード機能を提供する他のプラグインを使用することも可能です。
  • Shortcode Redirect プラグイン

アイデアは、未ログインユーザーにログインフォーム(および Patreon ログインボタン)を表示する特別なページを作成することです。ユーザーがログインしている場合は、https://community.morevnaproject.org/session/sso?return_path=%2F URL にリダイレクトされます。
(もちろん、「community.morevnaproject.org」はご自身のドメインに置き換えてください)。

私の特別なログインページのコンテンツは以下の通りです:

[members_not_logged_in]
   [woocommerce_my_account]
   [patreon_login_button]
[/members_not_logged_in]
[members_logged_in]
   [redirect url='https://community.morevnaproject.org/session/sso?return_path=%2F' sec='0']
[/members_logged_in]

(実際の動作はここで確認できます:https://morevnaproject.org/log-in-discourse/)

あとは、WP-Discourse プラグインを設定して SSO にそのページを使用するだけです:

Discourse で「Log In」ボタンをクリックすると、ユーザーは私の特別な WordPress ページにリダイレクトされます。ユーザーが未ログインのため、ログインフォームが表示されます。「Log in with Patreon」ボタンをクリックすると、認証のために Patreon にリダイレクトされます。認証が成功すると、再び私の特別なページにリダイレクトされます。ユーザーはすでにログインしているため、「redirect」ショートコードが有効になります:

[redirect url='https://community.morevnaproject.org/session/sso?return_path=%2F' sec='0']

…そしてユーザーは正常に Discourse フォーラムにリダイレクトされます。

URL の末尾にある session/sso?return_path=%2F の部分は必須です。これを省略すると、リダイレクト後に Discourse がユーザーをログイン済みとして認識しません。

以上です!WordPress と Patreon ログインを組み合わせた SSO を自サイトで行いたい他のユーザーのお役に立てれば幸いです。:slight_smile:

よく見つけられましたね :+1:

あなたがなさった作業の価値を損なうつもりはありませんが、私の最初の考えとしては、この段階で外部認証サービス(okta.comauth0.com など)の利用を検討すべきだと考えます。パトレオン、ワードプレス、ディスコースという 3 つの異なるサービスを連携させて、一度に単一の認証を実現しようとする時点で、専用の認証ソリューションを検討すべきサインです。何らかの方法で実現できたとしても、そのソリューションが機能しなくなったり、すべてのケースで動作しなかったりする可能性という、それなりの長期的なリスクが存在します。

もしそれでもこの方向に進みたいのであれば、いくつかの提案があります。ただし、ここからは少し技術的な内容になります。同じ問題に直面してさらに進めたいと考えている他の人のためにも、ここに記しておきます。

Patreon Wordpress Plugin のコードを簡単に確認しましたが、OAuth フローにおいて state パラメータに final_redirect_uri というキー/バリューを受け付けるようです。これにより、パトレオンの認証からディスコースの SSO へ直接遷移することが可能になり、前述の Members プラグインや Redirect プラグインの必要性がなくなり、そのアプローチに伴う問題も回避できます。

多くの認証サービスには、final_redirect_uri パラメータのバージョン、つまり認証後にユーザーをどこへ送るかを指定できるパラメータが存在します。もしあなたが同じ問題を解決しようとしていて、パトレオン以外のサービスを使用している場合、かつ「3 つの異なるサービスを接続することへの警告」が当てはまらないと判断しているなら、そこが注目すべきポイントです。

つまり、パトレオンログインボタンを生成するショートコードが final_redirect_uri を引数として受け付け、それがパトレオンが使用する最終的なログイン URL に渡されるようにする必要があります。Patreon Wordpress Plugin のコードを見ると、これは実現可能な提案です。参考までに、パトレオンの URL を生成する関連関数は以下のようになります。

Patreon_Frontend::patreonMakeLoginLink(false, array( 'final_redirect_uri' => # ) );

基本的には、このコードはすでにカスタム final_redirect_uri を処理するよう部分的に設定されています。Patreon Wordpress Plugin の開発者がこれを追加したくない理由は理解できますが、ここで私が説明した内容を明確に表現できる自信があるなら、彼らの GitHub リポジトリで issue を作成する価値があるかもしれません。それが難しい場合は、上記で参照した関数を使って自分でリンクを生成し、独自のボタンを作成するか(またはそのためにワードプレス開発者を雇う)、という方法もあります。

SSO URL の構築に関する小さな注意点ですが、以下のように記述する方が少し明確です。

https://discourse.example.com/session/sso?return_path=/

これは以下の URL の代わりに使用します。

https://discourse.example.com/session/sso?return_path=%2F

最後の部分である return_path は、ログイン後にユーザーがディスコース内で送られるパスです。/ の場合、ユーザーはフォーラムのホームページへ送られます。SSO URL の構築の詳細については、WP Discourse Tips and Tricks をご覧ください。

+1 はい、リスクはあります!:slight_smile:

おぉ、詳細な手順をありがとうございます!つまり、[patreon_login_button] ショートコードを final_redirect_uri パラメータを受け取るように変更し、彼らの GitHub リポジトリに PR を提出するのが理にかなっているのですね。丁寧に説明してくださり、改めてありがとうございます!