外部 SSO プロバイダーでアカウントを自動的にプロビジョニングしますか?(「新しいアカウントの作成」プロンプトをスキップ)

I’ve just setup a Discourse instance and added the discourse-openid-connect to it, connecting Keycloak as the OIDC provider.

After following the 3 conditions stated here with a recent update, I get the behaviour to authenticate via Keycloak, or if already logged in, clicking the “Login” button will prompt me to “Create New Account” with the fields filled in sourced from Keycloak info on the user.

Is there a way to skip this part requiring an additional step from the user? These are fields are naturally already populated from Keycloak, so there shouldn’t be a need for the user to modify them specifically for Discourse.

The account creation should be handled implicitly, similar to how Grafana is able to do it? I am aiming for each service provided by the community to support this seamless experience, that the original community account that is signed-up is all they have to deal with.

This might not make sense if you’re thinking about external auth such as Google / Facebook / Github / etc. A user can register their community account via Keycloak with one of those, but Keycloak itself which is only used internally is what is intended to work with all the individual services, so implicit/automated consent and sign-up is desirable.

Discourse 初心者ですが、SSO OAuth2 プロバイダーの設定と動作は完了しています。新規ユーザーが初めて Discourse にアクセスして認証すると、プロンプトが表示されます。このプロセスを簡素化し、ユーザーを自動的に作成するにはどうすればよいでしょうか?その画面に表示される値は正しく、一度きりの設定です。この画面を削除し、コミュニティのユーザーにとってアカウント作成プロセスを簡素化するにはどうすればよいでしょうか?

現在、これは実現できません。ユーザーが初めてアカウントを作成する際は、サインアップフォームにある「新しいアカウントを作成」ボタンをクリックする必要があります。

お探しの動作は、Discourse の SSO 実装に似ています。その場合、ユーザーがサインアップフォームに入力しなくても、バックグラウンドでアカウントが作成されます。OAuth2 ログインに対しても同様の機能を実装できる可能性はありますが、OAuth2 プロバイダーからアカウント作成に必要な情報が十分に渡されないケースがあるかもしれません。

ここでの投稿以降、あまり時間を割いていませんでしたが、結局、OpenID-Connect用のブリッジングサービスとしてDiscourseのSSO機能を採用しました。これはDockerコンテナを持つPythonサービスで、私のdocker-compose環境でのデプロイが容易になりました。

Keycloakがすでに登録されサインイン済みのアカウントを提供し、Discourseを訪問すると、ブリッジから提供された詳細情報を使ってユーザーがサインアップされました(記憶違いでなければ)。以来、しばらくこの件に関わっていませんが、DiscourseのOAuth/OpenID-Connectサポート(少なくとも当時、改善されたかどうかは確認していませんが)よりも、やや優れたプロセスでした。

いずれにせよ、アカウント情報の同期は期待通りに機能しません。同期を行うには、ユーザーはDiscourseからサインアウトして再度サインインする必要があります。さらに、SSOプロバイダーからDiscourseへ同期できない項目(グループやロールなど)もあったと記憶しています(いくつかの落とし穴がありました)。

プロバイダー側でユーザー情報が更新されたことを検知し、DiscourseのAPIを通じて更新をトリガーすることで、適切な同期設定が可能になると思います。そうしないと、同期されていない重複情報が存在したり、ユーザーにとって混乱を招く同期状態になったりする可能性があります。


さて、現在のOAuth2 SSO統合が、一般的にSSOブリッジを必要とするDiscourse SSO機能ではなく、プラグイン代替版である場合、SSOブリッジ付きの非プラグイン版に変更することで、ご希望の体験が得られるはずです(記憶違いでなければ)。

OAuth2 を使用する場合、この「新規アカウント作成」ウィンドウが表示されないようにしたいと考えています。
すべてのフィールドが利用可能な場合にスキップできるよう、どこかにオプションを追加することは可能でしょうか?

この問題の解決に役立つ新しいサイト設定を追加しました。'新しいアカウントの作成’画面をスキップするには、sso_overrides_usernamesso_overrides_emailsso_overrides_name を有効にしてください。

さらに、ポップアップを完全にスキップするには、external_auth_skip_create_confirm を有効にしてください。

そのオプションが表示されない場合は、最新の「tests-passed」バージョンを使用していることを確認してください。

external_auth_skip_create_confirm が有効になっています

問題が発生しています:

  1. Discourse にすでに test__EMAIL__ というアカウントが作成されています。
  2. OpenID でログインし、ユーザー名:test、メール:test__EMAIL__ を指定すると、新しいユーザー名(test1)とメール(test__EMAIL__)の入力を求める「新しいアカウント」ウィンドウが表示されます。

既存のアカウントと OpenID を連携させる方法がありません。

お使いの OpenID Connect プロバイダーは、ユーザーのメールアドレスを検証していますか?検証済みで、かつ検証フラグが正しく設定されている場合にのみ、OIDC から提供されたメールアドレスを「信頼」できます。

OID プロバイダーなし - Keycloak と LDAP ユーザーフェデレーション
解決方法が見つかりました。既存のユーザーは、ユーザー設定インターフェースから OpenID に接続できます。

@david 現在、2.5.2 stable を使用していますが、このオプションが存在しません……このオプションを stable ブランチに移行することは可能でしょうか?必要ですが、本番環境では stable ブランチ以外は何も使用していません……

残念ながら、安定版ブランチへの新機能のバックポートは行っておりません。次期安定版のリリース時期については、#releases をご確認いただくようお願いいたします。

@david
次の安定版の内容が完全には明確ではありませんね……マイナーバージョンの 2.5.3 でしょうか、それともバージョン 2.6.0 でしょうか?

次のメジャーバージョンは 2.6.0 になります。マイナーバージョン(2.5.x)は、セキュリティ修正のためだけにリリースされます。

@david
ありがとう!今でははっきりしました。2.6.0 は今年リリースされますか?)))

確定した日はまだありませんが、今年は実現する可能性は高いですよ :slight_smile: