NeonCRM と discourse-oauth2-basic プラグインの使用におけるエラー

まずは現在の Droplet を削除し、最初から再構築しようと思います。この Docker は数年前に設定されたものなので、そうするのが良さそうです。設定とテストが完了したら、改めて報告します。

良さそうな計画ですね。ほとんどのコミュニティでは、デフォルトの tests-passed ブランチを維持することをお勧めします。これにより、最新の Discourse 機能やバグ修正を享受できるからです。安定版リリース以降、認証に関する変更が多数行われているため、自然と動作し始める可能性があります。

@david さん、今日は再度取り組む時間を設けました。ご提案いただいた通り、最新の安定版(stable-passed)の Discourse を新規インストールして使用しています。

以前と同様に、プラグインを使用して Oauth2 を設定しました。設定は以下の通りです:

oauth2 client id: MY-CLIENT-ID
oauth2 client secret: MY-CLIENT-SECRET
oauth2 authorize url: https://MY-NEON-ID.z2systems.com/np/oauth/auth
oauth2 token url: https://www.z2systems.com/np/oauth/token

手動でフォーマットされた URL を使用すると、以下のようなエラー(新しい現象)が表示されます:

認証がタイムアウトしました、またはブラウザを切り替えています。もう一度お試しください。

また、ログにはいつものエラーが記録されています:

(oauth2_basic) 認証失敗!csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected

一方、Discourse のログインウィンドウにある OAuth2 ボタンを使用すると、以下のエラーが表示されます:

おっと

このディスカッションフォーラムを動かしているソフトウェアで予期しない問題が発生しました。ご不便をおかけして申し訳ございません。

エラーに関する詳細情報はログに記録され、自動通知が生成されました。確認いたします。

また、/logs に以下のエラーが記録されています:

ArgumentError (Invalid URI: ) /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/excon-0.71.0/lib/excon.rb:126:in `new'

および

Failed to handle exception in exception app middleware : Invalid URI:

@david 以前ご提案いただいた oauth2_user_json_url の設定と oauth2_fetch_user_details の無効化を試みたところ、以下のような(新しい)エラーが多数発生しました。

ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR: null value in column “provider_uid” violates not-null constraint
DETAIL: Failing row contains (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107).
)
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.4/lib/patches/db/pg.rb:69:in `async_exec_params’

Failed to handle exception in exception app middleware : PG::NotNullViolation: ERROR: null value in column “provider_uid” violates not-null constraint
DETAIL: Failing row contains (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107).

もちろん、いつものエラーも発生しています。

(oauth2_basic) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected

ただし、最後のエラー(CSRF 検出)について、env タブを確認したところ、以下のように表示されていました。

hostname forum-app
process_id 762
application_version db7d00a8dce2cc1f7b9d86192cde1f55dd57408b
HTTP_HOST forum.efao.ca

hostname と HTTP_HOST が一致しないのは正常な状態でしょうか?それが CSRF エラーの原因になっている可能性はありますか?

やあ、デニス、

解決しましたか?
私も同じエラーが発生しました:
ActiveRecord::NotNullViolation (PG::NotNullViolation: エラー:カラム “provider_uid” の null 値が not-null 制約に違反しています

どのように修正しましたか?

ありがとう、
ビーム

デニスと私は、NeonCRM が OAuth2 仕様を厳密に守っていないことを突き止めました。彼らは user_id を access_token 変数の内部に送信しており、これを実際のアクセストークンとして使用することはできません。

そのため、oauth2_fetch_user_details を無効にし、oauth2_callback_user_id_path を token に設定する必要があります(内部的な使用のために Ruby ライブラリが名前を変更するため、access_token ではありません)。

これで機能するはずですが、ユーザーのメールや名前を取得する方法はありません。

こんにちは、Denis さん、

Mattermost を使用しているため、動作が異なります。
ただし、あなたの情報のおかげで設定を詳しく確認することができ、無事に動作するようになりました。ありがとうございます!!

以下は、Mattermost を OAuth2 プロバイダーとして Discourse に接続するための私の設定です:

検索エンジン用にテキスト形式で設定を記載します:

oauth2 client id: <Mattermost OAuth2 プロバイダー設定から取得したクライアント ID>
oauth2 client secret: <Mattermost OAuth2 プロバイダー設定から取得したクライアントシークレット>
oauth2 authorize url: https://chat.animalrebellion.org/oauth/authorize
oauth2 token url: https://chat.animalrebellion.org/oauth/access_token
oauth2 token url method: POST
oauth2 callback user id path:
oauth2 callback user info paths
oauth2 fetch user details: CHECKED
oauth2 user json url: https://chat.animalrebellion.org/api/v4/users/me
oauth2 user json url method: GET
oauth2 json user id path: id
oauth2 json username path: username
oauth2 json name path: username
oauth2 json email path: email
oauth2 json email verified path: email_verified
oauth2 json avatar path:
oauth2 email verified: CHECKED

Mattermost 側では、コールバック URL は以下のように設定されています:
https://base.animalrebellion.org/auth/oauth2_basic/callback

まだ、first_name と last_name を “json name path” に結合して full_name として取得する方法を知りたいですが、“username” または “first_name” プロパティのみを使用しても問題ありません。

参考になれば幸いです。

では、
Beam

関連リソースへのリンク:
プラグインへのリンク: GitHub - discourse/discourse-oauth2-basic: A basic OAuth2 plugin for use with Discourse · GitHub
Discourse プラグインのインストール方法: Install plugins on a self-hosted site

@Beam さん、うまくいってよかったですね!