WP-Discourse プラグインへの最新のコミットにより、すべてのカスタム投稿 (EventON プラグイン経由で作成されたもの) が、Discourse と WordPress の両方に存在するにもかかわらず、system ユーザーに帰属するようになっています。
2.3.7 にロールバックすると期待どおりに動作しますが、2.3.8 に更新するとこのバグが発生します。
メールでこのエラーを受信します。
失敗の理由:
Discourse から 400 レスポンスコードが返されました。
param が欠落しているか、値が空です: post
意味は? post
post[raw]
controller
title
原因特定に役立つかと思いました。
angus
(Angus McLeod)
2022 年 2 月 21 日午前 7:52
2
参照しているプラグインへのリンクを共有していただけますか?また、WP Discourse のログに何か表示されていますか?
こんにちは @angus 様
プラグインはこちらです: https://www.myeventon.com/
プラグインのv2.3.7またはv2.3.8のログが必要ですか?
「いいね!」 1
angus
(Angus McLeod)
2022 年 2 月 21 日午前 8:03
4
両方可能であれば。詳細な公開ログをオンにしてください。
v2.3.7:
[2022-02-21 08:07:11] publish.INFO: create_post.post_success {"wp_title":"[Please Ignore] Test Event","wp_author_id":"3958","wp_post_id":126070,"discourse_post_id":""}
[2022-02-21 08:07:11] publish.INFO: create_post.body_valid {"wp_title":"[Please Ignore] Test Event","wp_author_id":"3958","wp_post_id":126070,"discourse_post_id":""}
投稿は2.3.7で、WordPressとDiscourseの両方で私のユーザーアカウントに正しくリンクされました。
v2.3.8:
[2022-02-21 08:10:15] publish.INFO: create_post.post_success {"wp_title":"[Please Ignore] Another test event","wp_author_id":"3958","wp_post_id":126071,"discourse_post_id":""}
[2022-02-21 08:10:15] publish.INFO: create_post.body_valid {"wp_title":"[Please Ignore] Another test event","wp_author_id":"3958","wp_post_id":126071,"discourse_post_id":""}
投稿は2.3.8で、WordPressでは私のユーザーに、Discourseではシステムユーザーにリンクされました。
「いいね!」 1
はい、投稿は正常に公開されていますが、v2.3.8では誤ったユーザー(システム)が割り当てられています。
angus:
以前は400エラーは発生していませんでしたか
いいえ、wp-discourseプラグインの以前のバージョンでは400エラーは発生していませんでした。
これらのユーザーはWordPressの管理者ではない登録ユーザーであり、これまでは正常に機能していました。どのユーザーもDiscourseで正しくリンクされていました。
グローバルAPIキーです。
「いいね!」 1
angus
(Angus McLeod)
2022 年 2 月 21 日午後 2:24
8
このPRがマージされ(そしてバージョンがWordpress.orgにプッシュされると)、期待どおりに機能するようになります。
main ← angusmcleod:two_three_nine
opened 02:16PM - 21 Feb 22 UTC
「いいね!」 2
同じエラーが発生しており、WP Discourse をバージョン 2.3.8 にアップグレードした後に発生したことを確認できます。
このバージョンでは、トピックは作成されますが、デフォルトのユーザーで作成されます。
確認のため、WP Discourse を 2.3.7 にロールバックしたところ、正常に動作しました。
「いいね!」 2
angus
(Angus McLeod)
2022 年 2 月 22 日午前 6:36
10
ありがとうございます。このPRがマージされた際に対応されます。PR がマージされた際に、対応されます。また、以下の2つの質問も確認していただけますでしょうか。
投稿を公開しているユーザーの種類(使用されることを想定しているDiscourseのユーザー名)は何ですか?(例:管理者かどうか)
WordPressとDiscourseを接続するために使用しているAPIキーの種類は何ですか?
ここでも同じ問題が発生しています。カスタム投稿タイプではありません。
管理者ユーザーではなく、モデレーターです。
「全ユーザー」APIキー。
angus
(Angus McLeod)
2022 年 2 月 22 日午後 7:13
13
皆さん、バージョン2.3.9がリリースされ、この問題が修正されました。アップデートして、状況をお知らせください。
「いいね!」 1
orenwolf
(Ken Snider)
2022 年 2 月 23 日午後 4:29
14
2.3.9でも同じ問題が発生しており、2.3.7にロールバックし、今後このプラグインの自動更新を無効にします。
「いいね!」 1
こんにちは、@angus さん
お騒がせして申し訳ありません。WordPress 5.9.1 と WP Discourse 2.3.9 で問題が解決したようです。
しかし、Discourse が公開された各投稿で追加の処理を行っており、後から System ユーザーから公開ユーザーに所有権が移行されているように見えます。
「いいね!」 1
angus
(Angus McLeod)
2022 年 2 月 23 日午後 5:40
16
@orenwolf 様、まだ問題が解決していないとのこと、申し訳ありません。投稿者の名前で公開されることを期待しているユーザーのWordPressプロフィールに「Discourse Username」が設定されているか確認していただけますでしょうか。
皆様、この件にご協力いただきありがとうございます。私のテスト環境(様々なサイトおよびプラグインの単体テスト)では、「Discourse Username」機能は「2.3.9」で期待通りに動作するようになりました。もし、まだ問題が発生している場合は、プラグインが最新バージョンであることを確認し、投稿の作成者として期待しているユーザーに「Discourse Username」が設定されているかご確認ください。
なぜこの問題が発生したのか疑問に思われるかもしれません。背景を説明することで(@itsbhanusharma 様のご質問にもお答えできます)、理解が深まるかと思います。以前は、この機能は「Api-Username」ヘッダーで異なるユーザーを使用していました(こちらを参照 )。これは、Discourseの関連エンドポイントが、APIリクエストを実行するユーザーとは異なる投稿の作成者を設定することをサポートしていなかったため、必要とされていました。
その結果、この機能が機能するのは、「All Users」APIキーと「Global」スコープを持っている場合のみでした。WP DiscourseプラグインのAPIキー作成に関する標準的な手順は、しばらくの間以下のようになっています。
まだAPIキーを作成していない場合は、「New API Key」をクリックし、User Levelを「Single User」に設定し、「User」を管理者アカウントに設定し、「Global Key」を選択して「Save」をクリックします。APIキーをコピーしてここに貼り付けます。
これらの手順に従うと、この(文書化されていない)機能は機能せず、様々なサイトで問題が発生していました。
さらに、様々なセキュリティ上の理由から、私はプラグインに変更を加え、より限定的なAPIキーを使用できるようにしてきました。これにはDiscourseの変更が必要ですが、(マージされれば)プラグイン管理者は新しい、はるかに限定的なAPIキーを発行できるようになります。その際には改めてお知らせいたします。
main ← angusmcleod:fix_wordpress_scopes
opened 09:46AM - 20 Dec 21 UTC
I'm looking to add granular API key usage for the WP Discourse plugin. This invo… lves:
- Updating the "wordpress" default mappings to reflect the actions being used by the plugin, grouped by the feature-set they relate to (note that the existing "wordpress" action in the "topic" resource only relates to comment retrieval in the plugin, and is somewhat confusing in its current state).
- Adding a ``session/scopes`` endpoint, which returns the scopes associated with the api key in the request.
This is the companion PR on the plugin, which will provide further context to this: https://github.com/discourse/wp-discourse/pull/431. See in particular [``validate_scopes``](https://github.com/discourse/wp-discourse/pull/431/files#diff-5fd9ce264afeb5f617119db36e34a2e5a33f605527ac6fa9ee761b8123f1a17eR185).
If this approach is acceptable, I'll do some more testing before moving this out of draft. Below are some Q/A explaining my thinking behind this.
### Why does the wordpress plugin need granular scopes?
Currently the plugin requires the use of a global key, but only uses a subset of the actions, creating more risk than necessary. [See for example](https://meta.discourse.org/t/what-scopes-exactly-does-the-wordpress-api-key-need/175812).
### Why group the scopes by feature set?
This is how people use the plugin. Some use only SSO, some only publishing, some without comments etc. If a user is not using SSO they should be able to use a key that doesn't include the ``admin/user`` actions SSO requires.
Currently the "publishing" feature set cannot be totally disabled in the plugin (hence the "(required)" in the action description), however the ability to disable it (and just use SSO) may be added.
### Why add a ``session/scopes`` endpoint?
The WP Discourse plugin currently sends a request to ``/users/:username`` to test its connection to Discourse. This may be successful even if the allowed scopes are insufficient for how the plugin is configured.
A scopes endpoint tells the API consumer both whether the connection is successful and what scopes their key has. There's similar implementations in other APIs, e.g [Sendgrid](https://docs.sendgrid.com/api-reference/api-key-permissions/retrieve-a-list-of-scopes-for-which-this-user-has-access).
### Why add the ``scopes`` endpoint to the session controller?
The endpoint could go in a few different places. I figured it belonged there as essentially you're asking about the scopes in the session created when the api-authenticated request is made.
### Why not use a ``tokeninfo`` endpoint?
``tokeninfo`` endpoints are part of the OAuth 2.0 spec, which is not what we're dealing with here. Using it may be confusing.
はい、@itsbhanusharma 様、この機能は現在、投稿が作成された後に投稿の所有者を変更するために2回目のリクエストを行うことで機能します(「Discourse Username」が存在する場合)。これは実際、上記の「Api-Username」と「All Users Global Key」を使用することなく、Discourse API経由で投稿の所有者を任意に設定する唯一の適切な方法です。この操作の性質を考慮すると、パフォーマンス上の懸念はないはずです。
「いいね!」 4
パフォーマンスの懸念ではなく、投稿の上部にある鉛筆アイコンが正常であり、それが今後も続くことを、あまり詳しくない人々に説明するのが面倒だということです。
時間がかかりますが、最終的には慣れるでしょう。
投稿が編集済みとして表示されるのは少し気になりますが、すべてが機能する限り問題ありません。
しかし、通知が間違っているのは問題です。システムユーザーが新しい投稿を作成したことを示しています。
これまでのところ、これは解決策ではなく、単なるハックのように感じられます。適切なユーザーとして自動的に投稿できなくなるのは、明らかに大きな後退です。これが最初に壊れた原因がよくわかりません。
angus
(Angus McLeod)
2022 年 2 月 24 日午後 12:44
19
要約すると、プラグインがさまざまな理由、特にテストとセキュリティのために、すべてのリクエストを Discourse で処理する方法を徐々に変更してきました。変更の完全なコンテキストと根拠は、ここで説明するには長すぎます。この特定の機能のコンテキストでは、「壊れていないなら直すな」のように感じられるかもしれませんが、より広範なコンテキストがあります。
これらの変更はしばらく(数ヶ月)続いていますが、今回表面化している理由は、2.3.8 リリースで間違いを犯したためです。そのため、そのリリースに含まれるべきだった変更を 2.3.9 に含めました。
とはいえ、@jtbayly @itsbhanusharma 、この特定の機能に対する異なるアプローチについてのフィードバックを承知しています。ハックのように感じられるかもしれませんが、そうではありません。それにもかかわらず、皆様のフィードバックを踏まえ、ご希望であれば設定で有効にできる形で、既存の方法をプラグインに戻します(2.4.0 で公開されます)。数日中にマージされたら、その旨を追って通知します。
皆様が提起された問題に対処できれば、このアプローチを完全に削除できる見込みです。おそらく、discourse/discourse にさらに変更を加えることになるでしょう。前述のとおり、来月中にプラグインが API キーを処理する方法の変更について、より大きな発表を行う予定です(discourse/discourse への変更がいつマージされるかによります)。これには、この件の側面も含まれます。
「いいね!」 4
jtbayly:
そもそも何が原因で壊れたのかよくわかりません。
私がこれを言ったとき、他に前進する方法があるかどうか確信が持てなかったことを認めるつもりでした。「なぜそれを壊したのか!」というコメントではありませんでした。
WPプラグインを最新のコアDiscourseで動作させ続けるあなたの仕事に非常に感謝しています。そして、この分野での改善を可能にするコアへの(おそらく)変更が来ることを非常に嬉しく思っています。
「いいね!」 1