通过API删除用户头像

你好!

我们有一个通过 SSO 连接到我们应用的 Discourse 论坛应用。用户头像会通过该机制直接更新。但由于我们的照片需要经过审核,因此我们需要在 Discourse 应用端清除用户头像。

是否可以通过 REST API 或增强 SSO 机制来实现?我在文档中找不到相关信息。

谢谢!

1 个赞

您应该能够调用 sync_sso 路由 来重新同步用户头像,但您也可以向 http://localhost:3000/u/<username>/preferences/avatar/pick 发送一个 PUT 请求,并附带一个空的 upload_id。

以删除用户当前的头像并为其分配一个字母头像。

4 个赞

@blake 发送此请求时出错。我使用了 POST 请求。
{
“failed”: “FAILED”
}

你尝试过按建议使用 PUT 请求了吗?

1 个赞

@pfaffman 抱歉,我用了 put

2 个赞

如果您启用了 sso overrides avatar,则必须使用 sync_sso 端点。

2 个赞

我们使用 SSO 端点,但用户头像仅在登录时刷新。在我们的情况下,需要手动刷新。

1 个赞

好的,完全没问题。您可以随时手动向 sync_sso 端点发送 POST 请求。

1 个赞

能否请您附上该端点的 API 文档链接?

1 个赞

以下是您可以使用的 Ruby 代码,它使用了 discourse_api gem,供您参考。sync_sso 端点与其他端点略有不同,因为您需要向其发送一个已签名的负载

client = DiscourseApi::Client.new('host')
client.api_key = 'api_key'
client.api_username = 'api_username'
puts client.sync_sso(
  sso_secret: 'abcdefghij',
  username: '24db27218ed09205a5a0',
  name: '24db27218ed09205a5a0',
  email: '24db27218ed09205a5a076983bf241ab@example.com',
  external_id: '684',
  avatar_url: 'https://d3bpeqsaub0i6y.cloudfront.net/user_avatar/meta.discourse.org/codinghorror/240/110067_2.png',
)
2 个赞

我理解得对吗?我们可以发送 POST /admin/users/sync_sso?api_key=...&api_username=...&sso=...&sig=... 请求吗?
参数 ‘sso’ 和 ‘sig’ 是否与 SSO 授权流程中的相应参数类似?

我尝试按照上述说明执行请求 POST /admin/users/sync_sso?api_key=...&api_username=...&sso=...&sig=...,它返回了 200 状态码并识别了我的用户,但用户头像并未更新,且没有任何日志事件。我哪里做错了?

您应在 HTTP 请求头中包含 api_keyapi_username,因为在查询参数中使用它们已被弃用(https://meta.discourse.org/t/discourse-api-documentation/22706)。

我认为代码中应该有某种保护机制,防止在字段缺失或为空时意外删除头像。您很可能需要提供默认头像的 URL 来替换现有头像。

我已将 API 凭据替换为请求头。
SSO 同步未能使用提供的头像更新用户头像。尽管该调用中的 Sidekiq 任务已完成,且未出现任何错误或警告日志。

您可以在站点设置中启用详细 SSO 日志,以查看是否有相关记录。

您提供的 avatar_url 是公开可访问的吗?您的 Discourse 站点需要能够访问该链接。

1 个赞