私が知る限り、最悪のシナリオは以下の条件を必要とします。
- 外部サイトでメールアドレスが検証されていない
- SSOペイロードで
require_activation=trueが設定されていない - Discourseサイトに
SingleSignOnRecordが関連付けられていない既存のアカウントがある(アカウント所有者がDiscourseにSSOでログインしたことがない)
この場合、SSOでログインしたことがないDiscourseユーザーのメールアドレスを使用して、外部サイトでサインアップすることができます。これにより、外部サイトの未検証アカウントが、同じメールアドレスを使用しているDiscourseアカウントを乗っ取ることが可能になります。これは、Discourse上の管理者アカウントの場合、特に懸念されるでしょう。
外部サイトがメール検証を処理しない場合は、Discourseがメール検証を処理することが推奨されます。
ただし、メール検証を外部サイトで処理する方が良いのには、いくつかの理由があります。
- ユーザーにDiscourseからの確認メールを受信させることは、ユーザーが初めてDiscourseにログインしようとするときのわずかな手間になります。(現実的には、その手間はどこかで発生する必要があります。Discourse側か、外部サイト側のどちらかです。)
- SSOペイロードで
require_activationがtrueに設定されている場合、Discourseは既存のDiscourseアカウントをメールアドレスに基づいて外部ログインと一致させません。これは、ユーザー名/パスワードで登録してDiscourseにアカウントが作成された後にDiscourseConnectを有効にした場合に問題となります。また、何らかの理由でDiscourse上のSingleSignOnRecordエントリを削除する必要がある場合にも問題となります。ユーザーがDiscourseに再度ログインしようとしても、Discourseは自動的に新しいSingleSignOnRecordエントリを作成しません。