当使用 SSO 并设置 sso overrides avatar: true 时,Discourse 似乎会下载头像,并始终在本地提供,而不是直接链接到提供的 URL。
是否允许头像直接从提供的 avatar_url 加载更有意义?目前,每次显示头像时都会不必要地访问 Discourse 后端。这或许可以作为一个 SSO 选项?
如果担心头像可能丢失,可以通过图片的 onerror 事件处理,将 src 回退到本地下载的版本(或显示默认头像)。我不确定是否仅靠 CSS 就能限制过大的头像图片。
1 个赞
DrewH
(Drew)
2
我相信禁用 download_remote_images_to_local 应该能解决您的问题,但这会导致帖子中的图片改为远程加载,而非本地加载。
这似乎仅适用于帖子中的图片——或者在 SSO 未覆盖的情况下,也适用于本地头像。
1 个赞
DrewH
(Drew)
4
有意思。我知道 OIDC 插件允许在每次登录时覆盖邮箱,也许 SSO 也可以类似地覆盖头像。
Falco
(Falco)
5
如果 SSO 头像的格式为 https://central.avatar.service/<username>,您可以使用站点设置 external_system_avatars_url 来实现此功能。
这在我们的情况下并不适用(它们是从 S3 提供的)——而且通常不太可能采用这种格式,以便能够高效缓存。
两年后对此进行跟进,因为我认为我之前误解了某些内容,但我仍然认为这里有一个简单的性能提升机会。
以前我认为头像存储在本地(Discourse 服务器本身),并且想知道为什么它们不直接从 SSO 外部头像 URL 提供服务,而是命中 Discourse。但是,在进行一些检查后,我现在看到来自 SSO 的外部头像已经上传到对象存储(例如 S3)并具有所需的多种尺寸。
所以,如果我理解正确,目前 Discourse 正在将头像从对象存储代理到客户端。但是,这种行为似乎仅限于使用 SSO 外部头像时,因为这里的头像来自(CDN 化的)对象存储。但是,当使用带有外部 URL 的 SSO 时,头像 URL 的形式为
https://discourse-host/user_avatar/discourse-host/{username}/{size}/{uploadid}_{version}.png
其中每次显示头像时都会命中 rails(在被客户端缓存之前)。
而且,如果我理解代码,甚至还有一个设置允许重定向而不是代理,但那时它已经命中 rails,并且重定向只会增加客户端的加载时间。
直接将头像链接到对象存储(可能从 CDN 提供服务)而不是同时释放一些 rails 资源,岂不是更快?/cc @Falco
Falco
(Falco)
9
并非如此。默认情况下,Discourse 会代理头像请求,就像你在你的站点上看到的那样。
但是,去年我们引入了一个可以通过环境变量 DISCOURSE_REDIRECT_AVATAR_REQUESTS=1 启用的设置,以触发你在这里看到的行为。
1 个赞