こんにちは、
本日、当社のフォーラムの認証を Azure AD / O365 に拡張しようと試みました。(すでに内部 AD への SAML 認証は稼働していますが、より多くのユーザーが Azure AD へ移行しています。)
そこで、この機能を提供する 3 つのプロバイダーを試しました:
および
残念ながら、discourse-azure-ad は何も機能しませんでした。ログイン/登録画面にボタンすら表示されませんでした。
openid-connect は動作しましたが、Azure の「すべてのテナント」向けエンドポイント(https://login.microsoftonline.com/organizations/v2.0/.well-known/openid-configuration)の性質上、Issuer の URI に「…/{tenantid}/…」が返ってくるため、これは自社の Azure AD / Office 365 テナント内のユーザーにのみ有効で、他のテナントのユーザーには機能しませんでした。
そのため、Office365-Auth プラグインが最後の選択肢となりました。
これは動作しました(他の Azure AD テナントのユーザーからも可能でしたが)、Azure AD ログインのメールアドレスが既存の Discourse ユーザーのプライマリメールアドレスと一致しない場合にログイン失敗というバグがありました:
つまり:
ログインをユーザーにマッチさせるために、2 番目のアドレスを追加する必要がありました。しかし、そのアドレスが「セカンダリ」である限り、ログインはエラー(「これを行う権限がありません」)で失敗しました(登録は成功しました)。
また、このプロバイダーでは、ユーザー画面から新しいログインを「関連付ける」ことができませんでした(新しいクールな機能ですね
)。
私はすぐに、このメールによるログインの問題がコードの以下の部分にあることを特定しました:
Ruby や Discourse に詳しくないため断定はできませんが、このコードは、いずれかのメールアドレスが一致しない場合にプライマリメールアドレスの更新を試みるもののようです(複数のメールアドレスが存在し、プライマリが O365 からのものではない場合に失敗します)。
しかしながら、openid-connect はこの部分を正しく実装しており、メールの更新(または非更新)を設定できるオプションや、ユーザー画面からログインを関連付ける機能も提供していました。そこで、私は恥じらわずに openid-connect から関連する行を office365-auth にコピーし、office365-auth の「after_authenticate」をコメントアウトしました。その結果、すべての Azure AD テナントからのログインが可能になり、ユーザーのいずれかのメールアドレスが一致すれば関連付けも機能するようになりました。
関連する変更は私の GitHub リポジトリにあり、プルリクエストを作成する予定です。ただし、まだ 1 つ問題が残っています ![]()
接続/解除の機能を追加したため、プロバイダーがユーザープロフィールに表示されるようになりましたが、その名前が表示されません:
これを追加するにはどうすればよいでしょうか?関連するドキュメントへのリンクはありますか?client.en.yml に記入するだけでは不十分に見えるのですが、他に何か見落としているのでしょうか。
この問題を解決した後、更新/修正されたプロバイダーのプルリクエストを作成する予定です。

