API経由でのユーザーアバター選択が機能しなくなりました

皆さん、こんにちは。フォーラムでSSOを使用しており、アバターは私のウェブサイトで管理されています。

数日前まで、ウェブサイトからAPI経由でDiscourseにアバターをアップロード/更新することは機能していました。しかし、現在は422 - Unprocessable Entityエラーが発生しています。

問題をデバッグしようと、Postmanでテストしましたが、同じ問題が発生しました。実行しているリクエストは以下の通りです(URL、ユーザー名、APIキーは当然削除しています)。

Discourseのこの部分に何か問題があることをご存知の方はいらっしゃいますか?

事前に感謝いたします。

私の例:

curl --location --request PUT 'https://{{URL}}/u/{{USERNAME}}/preferences/avatar/pick' \
--header 'Api-Key: {{API_KEY}}' \
--header 'Api-Username: system' \
--header 'Content-Type: application/json' \
--data-raw '{
"upload_id": 972,
"type": "uploaded"
}'

どなたか?同じ問題を見つけた方はいませんか?

これは、API が S3 への直接アップロードを行うように変更されたことに関連している可能性があります。

アバターのユーザーへの割り当てではなく、実際のアップロードに干渉すると思います。

ファイルは問題なくアップロードできます。アバターとして使用するファイルを指定するためにAPIを呼び出すときにエラーが発生しますが、それは突然始まりました。

「いいね!」 1

これで運試しに最後のブーストを試してみます。誰もこれを見つけられないのは奇妙です。もう何年も動作しているので、コーディングの問題ではないと確信しています。

「いいね!」 1

これは、discourse connect overrides avatar というサイト設定が原因だと思われます。

DiscourseConnect のペイロードの値でユーザーのアバターを上書きします。有効にすると、ユーザーは Discourse でアバターをアップロードできなくなります。

ローカル環境でこの設定をオフにした場合、API経由でアバターを更新すると 200 HTTP レスポンスが返ってきます。

curl -i -sS -X PUT "http://localhost:4200/u/10614bb2d4eacd328c45/preferences/avatar/pick.json"  \
-H "Content-Type: multipart/form-data"  \
-H "Api-Key: 6cea489d21282803c446fd2e9d236901c3d186f36079911833db4b57c43c01d5"  \
-H "Api-Username: blake.erickson"  \
-F "upload_id=57"  \
-F "type=uploaded"

HTTP/1.1 200 OK

この設定をオンにすると、422 が返ってきます。

curl -i -sS -X PUT "http://localhost:4200/u/021ca796a01ad178bc52/preferences/avatar/pick.json"  \
-H "Content-Type: multipart/form-data"  \
-H "Api-Key: 6cea489d21282803c446fd2e9d236901c3d186f36079911833db4b57c43c01d5"  \
-H "Api-Username: blake.erickson"  \
-F "upload_id=57"  \
-F "type=uploaded"

HTTP/1.1 422 Unprocessable Entity
「いいね!」 1

ブレイクさん、協力ありがとうございます。

有効にしても無効にしても、残念ながら違いはありません。

「いいね!」 1

まだ回答はありませんが、確認すべき事項リストに入っていることをお知らせします。ローカルでテストできるSSO設定があるので、設定が一致することを確認できます。最近誰かが変更した可能性のあるサイト設定を尊重すべきですが、APIオーバーライドを追加することもできるかもしれません。

「いいね!」 1

ブレイクさん、どうもありがとうございます。何かお手伝いできることがあれば、お知らせください。

「いいね!」 1

そのメソッドで422エラーが発生するもう1つの理由は、allow_uploaded_avatars設定がfalseの場合です。それが問題だと思います。

「いいね!」 1

リチャードさん、こんにちは!ご意見ありがとうございます。

私もそう思いましたが、うまくいきませんでした。また、この問題は突然発生しました。誰も何も変更していません(私が唯一の管理者なので、誰かが設定を変更した可能性はありません)、メインのウェブサイトに変更はなく、コードの変更もなく、何もありません。

アバターのアップロードを許可する設定について教えていただけますか?この設定は、もはや真偽値(true/false)ではなく、特定の信頼レベルに設定されています。また、アバターを変更しようとしているユーザーの信頼レベルについても教えていただけますか?そして、Discourseの最新バージョンをご利用ですか?

以下に、アバターを選択するコードと、422エラーを返す行を示します。

コードベースの奥深くにある別の問題である可能性も否定できませんが、おそらくこれら3つのうちのいずれかでしょう。最初のものは discourse_connect_overrides_avatar に関連しており、明らかにそれは除外されました。2番目のものではないと思います。なぜなら、あなたのcurlコマンドは正しく、「uploaded」タイプが含まれているからです。3番目の allow_uploaded_avatars 設定の可能性もまだありますが、それが私がその設定値を知りたい理由です。

この問題が始まるまで無効にしていました。その後、0:新規ユーザーに変更しました。

しかし、無効にしていたときは常に機能していました。フォーラムから実際にアップロードしてほしくなく、SSOを使用するウェブサイトからアップロードしてほしいのです。それでも、0:新規ユーザーに変更しても何も変わりません。同じエラーが表示されます :frowning:

サイトの設定でアバターがブロックされている場合でも、API経由でアバターが機能しなくなるような最近のアップデートは見つかりませんでした。いずれにせよ、SSO(またはDiscourseConnect)を使用している場合は、UIルート(/u/username/preferences/avatar/pick)ではなく、ユーザーのアバターを更新するために/admin/users/sync_sso APIルートを使用する必要があります。

リクエストボディでこれらのパラメータを渡してください。

avatar_url: "url-of-image",
avatar_force_update: "true"

ブレイク様

いつもこの件にご協力いただき、誠にありがとうございます。

そのエンドポイントに関する情報はAPIドキュメントに見当たりません。新しいものですか?

また、以前にもお伝えしたように、アバターの更新は/u/username/preferences/avatar/pickエンドポイントを使用して数ヶ月間正常に機能していましたが、それが突然機能しなくなりました。本当に不可解です。

はい、ドキュメントに記載されるべきですね。新しいものではありませんが、他のすべてのエンドポイントとは異なります。

いくつかの情報はここで見つけることができます: Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso)

また、discourse_api Ruby gem が sync_sso エンドポイントをどのように使用しているかもわかります: discourse_api/lib/discourse_api/single_sign_on.rb at main · discourse/discourse_api · GitHub および discourse_api/lib/discourse_api/api/sso.rb at main · discourse/discourse_api · GitHub

SSO プロバイダーが使用しているのと同じ SSO シークレットを使用する必要があります。

ブレイクさん、ありがとうございます。

それでも、何もかもが勝手に動作しなくなったことや、そのエンドポイントを使っても、あちこちで422エラーが出ることは、私には理解できません。

別の解決策を探してみます。

お時間をいただき、本当にありがとうございました。

「いいね!」 1