JQ331
1
こんにちは。Discourse は初めてです。AWS で動作するアプリがあり、認証に Cognito を使用しています。このアプリを新しくホストした Discourse フォーラムに連携させたいと考えています。すでに良いスタートを切っていますが、最終的な手順についてアドバイスいただければ幸いです。
目標は、アプリと Discourse フォーラム間のログイン体験をシームレスにすることです。具体的には以下の通りです:
OpenId Connect 認証プラグイン はこれに最適のようです。このプラグインを使用できるようにするため、Discourse のビジネスプランに登録しました。
@david 氏から提供された手順に従い、Cognito 側の設定は以下の通り完了したと考えています:
-
Cognito から「OpenID Connect 発見ドキュメント」と「OpenID Connect クライアント ID」を取得しました。
-
Discourse の設定画面(openId_Connect 項目)で、これらを入力して保存しました。
-
「OpenID Connect 認証を有効化」にチェックを入れ、OpenID Connect 認可スコープに「openid email」と入力しました。これらの設定を保存しました。
プラグインの説明によると、これで準備完了のはずですが、合っていますか?
さて、アプリにログインしてからフォーラムにアクセスしても、何も起こりません。通常のホームページが表示され、「サインアップ」と「ログイン」ボタンが表示されたままです。Cognito と照合した後に自動ログインされることを期待していましたが、そうなりません。他に何をする必要がありますか?
さらに、ユーザーがアプリに一度もログインせずにフォーラムサイトに初めて訪れた場合、Discourse のサインアップやログインボタンは表示されないはずです。代わりに、クリックするとアプリのログインページにリダイレクトされるボタンが表示されるべきです。これをどう追加すればよいですか?
最後に、ユーザーはアプリにサブスクライブし、プレミアム機能の利用料を支払います。これは Cognito 内のユーザーのカスタム属性として保存されています(「サブスクライブ済み」または「未登録」を示すカスタム属性があります)。フォーラムへの投稿が可能なのはサブスクライブ済みのユーザーのみです。したがって、Discourse が Cognito と照合してユーザー情報を取得する際、ユーザーのカスタム属性も確認し、サブスクライブ済みのユーザーにのみ投稿権限を与える必要があります。これをどう実現すればよいですか?
Discourse 初心者ですので、これらの質問に関する情報があれば、どんなことでも大変感謝いたします。ありがとうございます!
david
(David Taylor)
2
こんにちは @JQ331 
自動ログインは、サイトがプライベート(login_required サイト設定が有効)の場合にのみサポートされています。
それは既にそのように動作するはずです。ローカルログインを含む、他のすべてのログイン方法を無効にしていることを確認してください。
残念ながら、OIDC プラグインではこれは不可能です。
JQ331
3
@david、返信ありがとうございます。とても助かりました。
この「login_required」サイト設定はどこにありますか?「非公開」とは、ユーザーがログインしていないとサイトコンテンツを閲覧できないという意味でしょうか?明らかに、それは私の望む動作ではありません。私が望んでいるのは、投稿するにはログインが必要で、ログイン方法は私の別のアプリを通じてのみ行うという仕組みです。
おそらく設定 → ログイン → ローカルログインを有効にする(このチェックを外す)という意味だと思います。そこで、すべてのローカルログイン関連のチェックを外しました。では、ここで何をチェックすべきでしょうか?例えば、私の別のアプリとの連携にプラグインを使用している場合、その別のアプリは「SSO」ですか、それとも「OAuth2」ですか?(例えば、「SSO がメールを上書き」または「OAuth2 がメールを上書き」のどちらを選択すべきか迷っています)
有料ユーザーのみが投稿できることについて:
これは基本的な要件なので、もしかしたら工夫が必要かもしれません。SSO プラグイン以外の選択肢はありますか?もしない場合、以下のいずれかが可能であれば、これでうまくいくかもしれません。
-
Discourse にユーザー権限のレベルが複数存在する。つまり、ユーザーはログインできても、投稿や返信の権限がないように設定できる。この場合、Cognito から Discourse が取得する情報(購読済みかどうか)に基づいて、ユーザーの権限レベルを設定する必要があります。
-
それがうまくいかない場合、Discourse には Stripe プラグインがあり、ユーザーはログインできても、Stripe システムを通じて支払いが完了している場合にのみ投稿できるものはありますか?
-
もしこれらのどちらもうまくいかない場合(例えば、Discourse に私が設定できるユーザー権限レベルを区別する機能がない場合)、ユーザーはログインしているかしていないかのどちらかになり、ログインしているユーザーのみが投稿できる、ということになりますね?それで合っていますか?
もしそうであれば、私のアプリ側で、ユーザーがアプリ内で支払いを完了している場合にのみ Discourse へログインさせる方法を自分で考える必要があります。
ありがとうございます。
david
(David Taylor)
4
その場合、自動ログインは現在サポートされていません。ユーザーはログインボタンをクリックする必要があります。
わかりました。これでログインボタンが直接 ID プロバイダーにリンクするはずです。動作していますか?
はい、すべてのカテゴリを「誰でも」閲覧できるように設定できます。ただし、トピックの作成や返信ができるのは、特定のグループに属するユーザーのみです。これを自動化したい場合は、API を使用してユーザーをグループに追加または削除できます。
JQ331
5
クール、かなり近いところまで来ているようです。確認させてください:
以下の状態にしたいと考えています:
- サイトコンテンツは誰でも閲覧可能(ログイン済みか否かに関わらず)
- 投稿できるのはログインユーザーのみ
- アプリにログインしている状態で Discourse にアクセスすると、Cognito と連携して自動的にログインし、投稿が可能になる
(3) は不可能だとおっしゃっているのでしょうか?サイトコンテンツが一般に非公開になっている場合のみ、自動ログインが機能するという意味でしょうか?
これが私がやりたいことですね。「API を使用する」とおっしゃったことから、以下のようなことを意味していると推測します:
- ユーザーがフォーラムにログインしようとする
- アプリへのログインにリダイレクトされる
- アプリにログインすると、アプリがユーザーの支払い状況を確認する。支払いが済んでいる場合、アプリは Discourse API を呼び出して、そのユーザーを投稿・返信可能なグループに追加する
そういう意味でしょうか?もしそうなら、API を通じてユーザーをグループに追加する方法を解説したドキュメントはありますか?
ありがとうございます。これで大きく前進できました。
david
(David Taylor)
6
おそらく「自動ログイン」の定義が異なるのでしょう。
Discourse はログインのために OIDC プロバイダーに接続できます。このプロセスは、ユーザーがフォーラムの「ログイン」ボタンをクリックしたときに開始されます。これは設定に関係なく、常に機能します。
サイトがログインを必須としている場合(つまり、「ログイン必須」設定が有効になっている場合)、ユーザーはボタンをクリックする必要なく、直接 OIDC ログイン画面にリダイレクトされます。
はい、それが私の考えていたことです。その API エンドポイントに関するドキュメントはこちらです。
JQ331
7
なるほど、ありがとうございます!そのAPIドキュメントを見てみます。非常に有望そうですね。
「自動ログイン」についてですが、これは「ユーザーを自動的にログイン画面へ誘導する」という意味でしょうか。つまり、ご提案されているのは、ユーザーが私のDiscourseフォーラムにアクセスした際に、以下の2つの選択肢があるということですね。
オプション1:サイトが「自動的に」ユーザーを別のアプリのログイン画面へ送る。これは、ユーザーがすでにアプリにログインしているかどうかに関わらず発生します(これが「auto-login」と呼ばれるもので、「login_required」を設定することで実現されるとのことですね)。
オプション2:サイトが自動リダイレクトを行わない。代わりに、ページ上に基本的なログインボタンを配置する。ユーザーがそのボタンをクリックするか、投稿を試みると、フォーラムがユーザーをアプリのログイン画面へリダイレクトする。
私はオプション3を期待していました。つまり、ユーザーがアプリにログインしている状態でDiscourseフォーラムにアクセスすると、DiscourseフォーラムがCognitoにユーザーのログイン状態を確認する。もしCognitoでログイン済みであれば、ユーザーが再度個別にログインする必要なく、Discourse側でフォーラムへのログインを完了させる。
OpenIDについては初心者ですが、これは可能だと考えていました。なぜなら、アプリとフォーラムを切り替えるたびにユーザーが個別にログインを繰り返す必要があれば、それはシームレスな体験ではないからです。
DiscourseフォーラムがCognitoに確認し、ユーザーが別途ログインプロセスを経ることなく、ログイン状態を調整する方法はないでしょうか?
余談ですが、Discourseをアプリに直接統合しても解決しないと考えています。可能であればそうしたいのですが、現時点ではiframeでのみ可能のようで、それでは認証の問題は解決しないようです。
david
(David Taylor)
8
OIDC仕様では技術的に可能ですが、残念ながらDiscourseは現在それをサポートしていません。
JQ331
9
ふむ、Discourse と Cognito などの別々の認証プロバイダーを連携させる方法には、OpenID プラグインを使う方法と、Discourse の Single Sign On を使う方法の 2 つがあると聞いています。
私は Single Sign On のプロセスについては全く詳しくありませんが、ユーザーが二度ログインする必要をなくすという私の目的を達成できる方法でしょうか?
あるいは、単にユーザーが私のアプリにログインした時点で、Discourse に対して API リクエストを送り、その方法でログインさせるのはどうでしょうか?
(リンクしたドキュメントにはグループメンバーシップの指定についても触れられています。これは、有料ユーザーのみが投稿を許可されたグループに参加できるようにするという私の目的を達成するものだと推測します)