SSO のメール認証を無効にする

こんにちは、

Discourse を Auth0 を SSO プロバイダーとして使用するように設定しました。問題点は、ユーザーが登録する際に、Auth0 からの確認メールと Discourse からの確認メールの 2 通が届いてしまうことです。

Discourse からのメールを無効にする方法はありますか?

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

メールアドレスが Auth0 によって検証されている場合、oauth2 email verified サイト設定を選択することで、Discourse からの認証メールを無効にできます。この設定に関する言及は、以下の投稿にあります:https://meta.discourse.org/t/how-to-use-auth0-with-the-oauth2-basic-plugin/64633/33。

「いいね!」 3

@simon さん、回答ありがとうございます。私は OAuth2 ではなく SSO を使用しています。

「いいね!」 2

SSO という用語は、いくつかの異なる認証方法を指すために使われることがあり、過去に何度か混乱を招きました。

Discourse の SSO 実装を使用している場合、メール検証は require_activation という SSO パラメータによって制御されます。メール検証をバイパスするには、このパラメータを "false" に設定してください。

「いいね!」 3

@simon さん、ありがとうございます。

完全に無効化するのは避けたいと考えています。現在、require_activation は Auth0 による認証の有無に応じて true または false を返すように設定しています。これで問題なく動作しており、ユーザーが Auth0 のメールをクリックして次にログインすると、Discourse 上で認証が完了します。

理想的には、メールの送信を抑制するだけで十分だと考えますが、何か見落としている点があればご指摘ください。

「いいね!」 1

なるほど、理にかなっていますね。当社の WordPress プラグインも、メール認証を同様の方法で処理しています。

Discourse が require_activation の値をどのように使用しているか確認したい場合は、こちらのファイルをご覧ください:https://github.com/discourse/discourse/blob/master/app/models/discourse_single_sign_on.rb#L81。SSO 経由でユーザーが作成された際、require_activation"false" に設定されている場合、Discourse はアクティブなユーザーを作成します。一方、"true" に設定されている場合は、ユーザーが Discourse のアクティベーションメール内のリンクをクリックするまで、ユーザーはアクティブ化されません。

Discourse 上でユーザーが active に設定されると、ユーザーの再アクティベーションが必要となるのは、sso_overrides_email サイト設定を有効にしており、ユーザーが SSO プロバイダーのサイトでメールアドレスを更新した場合のみです。

require_activation"true" に設定されている場合、Discourse は外部サイトのユーザーと既存のユーザーをメールアドレスに基づいて一致させる処理も抑制します。これにより、SSO を導入する前にユーザーがすでにユーザー名とパスワードでアカウントを作成していた場合に問題が発生する可能性があります。

「いいね!」 1

ありがとうございます、理解できました。ただし、Discourseから「メール認証」メールが送信されるのをどうやって止めるのかよくわかりません。

Auth0から送信されるメールだけを送りたいのです。

SSOプロバイダーのサイトから検証メールのみを送信するには、ユーザーがDiscourseに初めてログインする前に、そのサイトで登録し、メールアドレスを検証しておく必要があります。その後、該当ユーザーに対して require_activation パラメータを "false" に設定できるようになります。これにより、ユーザーはDiscourse上でアクティブなユーザーとして作成され、Discourseからのアクティベーションメールは送信されません。

「いいね!」 2

これは意味が通じません。Discourse への初回ログイン前にユーザーにメール認証を行わせるにはどうすればよいでしょうか?
私のウェブサイトですでにメール認証を処理しているため、Discourse からの認証メール送信を無効にしつつ、ユーザーに対して認証が必要であることを表示させるにはどうすればよいですか?

DiscourseConnect は、あなたのウェブサイト側でメールアドレスを検証していることを前提としています。その検証を行っていれば、SSO ペイロードに require_activation パラメータを設定しないでください。このパラメータがペイロードに含まれていない場合、ユーザーには認証メールが送信されずに Discourse にログインされます。

「いいね!」 2

はい、その場合、Discourse はユーザーが検証済みであるとみなしてしまいます。しかし、ユーザーがフォーラムにアクセスしてメールの検証を忘れたり、検証しないことに決めたりした場合は、実際には検証されていない可能性があります。Web サイトで require_validationtrue に設定している場合、ユーザーはまだ Web サイト上でメールを検証していませんが、検証リンクは確実に受信済みです。そのため、Discourse から再度送信する必要はありませんが、このパラメータのために送信されてしまいます。

基本的には、ユーザーが検証前に Discourse にアクセスした場合にのみ問題が発生します。そのため、現状では以下の 2 つの選択肢から選ぶしかありません:

  1. ユーザーは検証メールを 1 通のみ受信するが、Discourse 側では検証済みとして扱われてしまう。これは、ユーザーが検証を完了しない可能性があるため、理想的ではありません。
  2. ユーザーは検証メールを 2 通受信するが、フォーラムと Web サイトの両方で適切に検証される。この選択肢も理想的ではありませんが、2 つの中では明らかにマシです。

3 つ目の選択肢として、SSO が有効な場合のみ機能するスイッチを追加し、Discourse からの検証メール送信を無効にする(ただし、未検証であることを伝えるエラーページは残す)という方法もあります。

理想的には、ユーザーがあなたのウェブサイトでアカウントを作成する際、登録時にあなたのウェブサイトから送信されるアクティベーションメールに返信させることで、メールアドレスを検証してください。何らかの理由で、ユーザーがメールアドレスを検証する前にアカウント作成を許可している場合、SSO ペイロード内で require_validation パラメータを条件付きで設定できます。ユーザーがメールアドレスを検証済みの場合は、require_validationfalse に設定するか、パラメータをペイロードから省略してください。ユーザーがあなたのウェブサイトでメールアドレスを検証していない場合は、require_activation パラメータを true に設定して、Discourse からアクティベーションメールが送信されるようにしてください。

「いいね!」 1

まさにその通りで、これが問題です。例えば、ユーザーが登録し、ウェブサイトからアクティベーションメールを受け取りますが、それを開いてアクティベートする代わりに、なぜかDiscourseへ移動するとします。すると、ユーザーがまだアクティベートされていないため、require_activation が true に設定されてしまいます。しかし、Discourse はユーザーにもう一度アクティベーションメールを送信すると判断してしまい、これは問題です。なぜなら、すでにウェブサイトから送信されたアクティベーションメールがユーザーのメールボックスで開くのを待っているからです。Discourse は、ユーザーがメールを確認するよう伝えるエラーメッセージを表示するべきです。