API用户头像选择无法使用

大家好。我在论坛上使用 SSO,头像由我的网站控制。

直到几天前,通过 API 从网站上传/更新头像到 Discourse 一直在工作。我现在收到一个 422 - Unprocessable Entity 错误。

我尝试调试过这个问题,并使用 Postman 进行了一些测试,但遇到了同样的问题。我正在进行的请求如下(当然,已移除 url、用户名和 api_key)。

你们有人知道 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 payload 中的值覆盖用户头像。如果启用,用户将不允许在 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 个赞

Blake,你好。感谢你的帮助。

启用或禁用它,不幸的是都没有区别。

1 个赞

我还没有答案,但只是想让你知道这件事在我需要处理的列表上。我有一个可以本地测试的 SSO 设置,以便我们的设置保持一致。看起来我们应该遵循该网站设置,这可能是最近有人所做的更改,但也许我们可以添加一个 API 覆盖。

1 个赞

非常感谢你,Blake。如果有什么我能帮忙的,请告诉我。

1 个赞

该方法的另一个 422 原因可能是 allow_uploaded_avatars 设置为 false。我敢打赌这就是问题所在。

1 个赞

理查德,您好!感谢您的意见。

我也考虑过这一点,但它不起作用。此外,这个问题是突然出现的。没有人更改任何设置(我是唯一的管理员,所以不可能有人更改任何设置),主网站也没有代码更改,什么都没有。

您能否告知我 allow_uploaded_avatars 的设置是什么?它不再只是一个 true/false 设置,而是设置为特定的信任级别。另外,您能否告知我尝试更改头像的用户的信任级别是多少?您使用的是最新版本的 Discourse 吗?

这是选择头像的代码以及返回 422 响应的行。

这不代表不可能是代码库深处其他地方的问题,但很可能是这 3 个中的一个。第一个与 discourse_connect_overrides_avatar 有关,显然我们已经排除了它。我不认为第二个是问题,因为您的 curl 命令看起来是正确的,并且包含了“uploaded”类型。第三个关于 allow_uploaded_avatars 设置的可能性仍然存在,这也是我希望了解您该设置值的原因。

我之前禁用了它,直到这个问题开始出现。然后我将其更改为 0:new user。

但禁用它对我来说一直有效。我不想让用户从论坛上传,而是从使用 SSO 的网站上传。但是,将其更改为 0:new user 没有任何改变。我仍然收到相同的错误 :frowning:

我找不到任何可能阻止通过 API 使用头像的近期更新,尽管网站设置已阻止它们。无论如何,如果您正在使用 SSO(或 DiscourseConnect),您应该使用 /admin/users/sync_sso API 路由来更新用户的头像,而不是 UI 路由(/u/username/preferences/avatar/pick)。

并在请求正文中传递这些参数:

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

Blake,您好。非常感谢您在此事上提供的持续帮助。

我在 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 · GitHubdiscourse_api/lib/discourse_api/api/sso.rb at main · discourse/discourse_api · GitHub

它需要使用与您的 sso 提供商正在使用的 sso 密钥相同的密钥。

谢谢你,Blake。

对我来说,事情就这样自行停止工作并且我到处都收到 422 错误(即使是那个端点)仍然说不通。

我会尝试寻找其他解决方案。

非常感谢你的时间。

1 个赞