你好!
我们有一个通过 SSO 连接到我们应用的 Discourse 论坛应用。用户头像会通过该机制直接更新。但由于我们的照片需要经过审核,因此我们需要在 Discourse 应用端清除用户头像。
是否可以通过 REST API 或增强 SSO 机制来实现?我在文档中找不到相关信息。
谢谢!
你好!
我们有一个通过 SSO 连接到我们应用的 Discourse 论坛应用。用户头像会通过该机制直接更新。但由于我们的照片需要经过审核,因此我们需要在 Discourse 应用端清除用户头像。
是否可以通过 REST API 或增强 SSO 机制来实现?我在文档中找不到相关信息。
谢谢!
您应该能够调用 sync_sso 路由 来重新同步用户头像,但您也可以向 http://localhost:3000/u/<username>/preferences/avatar/pick 发送一个 PUT 请求,并附带一个空的 upload_id。
以删除用户当前的头像并为其分配一个字母头像。
@blake 发送此请求时出错。我使用了 POST 请求。
{
“failed”: “FAILED”
}
你尝试过按建议使用 PUT 请求了吗?
@pfaffman 抱歉,我用了 put
如果您启用了 sso overrides avatar,则必须使用 sync_sso 端点。
我们使用 SSO 端点,但用户头像仅在登录时刷新。在我们的情况下,需要手动刷新。
好的,完全没问题。您可以随时手动向 sync_sso 端点发送 POST 请求。
能否请您附上该端点的 API 文档链接?
以下是您可以使用的 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',
)
我理解得对吗?我们可以发送 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_key 和 api_username,因为在查询参数中使用它们已被弃用(https://meta.discourse.org/t/discourse-api-documentation/22706)。
我认为代码中应该有某种保护机制,防止在字段缺失或为空时意外删除头像。您很可能需要提供默认头像的 URL 来替换现有头像。
我已将 API 凭据替换为请求头。
SSO 同步未能使用提供的头像更新用户头像。尽管该调用中的 Sidekiq 任务已完成,且未出现任何错误或警告日志。
您可以在站点设置中启用详细 SSO 日志,以查看是否有相关记录。
您提供的 avatar_url 是公开可访问的吗?您的 Discourse 站点需要能够访问该链接。