SSO и внешние аватары

При использовании SSO с настройкой sso overrides avatar: true Discourse, похоже, загружает аватар и всегда отображает его локально, вместо того чтобы ссылаться напрямую на предоставленный URL.

Разумнее ли было бы разрешить отображение аватаров напрямую из предоставленного avatar_url? В текущем виде для каждого отображаемого аватара происходит лишний запрос к бэкенду Discourse. Возможно, это можно сделать опцией SSO?

Если проблема в том, что аватары могут исчезнуть, это можно решить с помощью события onerror для изображений, при котором src будет переключаться на локальную копию (или отображаться изображение по умолчанию). Я не знаю, можно ли ограничить размер слишком больших аватаров только с помощью CSS.

1 лайк

Я полагаю, что отключение download_remote_images_to_local должно решить вашу проблему, хотя при этом изображения внутри постов будут отображаться удалённо, а не локально.

Похоже, это касается только изображений в постах — или, возможно, локальных аватаров, когда они не заменяются через SSO.

1 лайк

Интересно. Я знаю, что плагин OIDC позволяет переопределять email при каждом входе. Возможно, что-то подобное можно реализовать и для переопределения аватара через SSO.

Если аватар SSO имеет формат https://central.avatar.service/<username>, вы можете использовать настройку сайта external_system_avatars_url, чтобы включить эту функцию.

В нашем случае это не так (они обслуживаются из S3), и маловероятно, что они обычно будут в таком формате, чтобы их можно было эффективно кэшировать.

Возвращаюсь к этому вопросу спустя пару лет, так как, похоже, я раньше что-то неправильно понял. Однако я всё ещё считаю, что здесь есть простой способ улучшить производительность.

Раньше я думал, что аватары хранятся локально (на самом сервере Discourse), и задавался вопросом, почему они не обслуживаются напрямую по внешнему URL аватара из SSO, а не через Discourse. Но после небольшого исследования я понял, что внешние аватары из SSO уже загружаются в объектное хранилище (например, S3) и доступны в требуемых размерах.

Итак, если я правильно понимаю, в настоящее время Discourse проксирует аватары из объектного хранилища клиенту. Однако такое поведение, похоже, характерно только для случаев использования внешних аватаров SSO, поскольку аватары здесь, на meta, загружаются напрямую из объектного хранилища (через CDN). Но при использовании SSO с внешними URL адреса аватаров имеют вид:

https://discourse-host/user_avatar/discourse-host/{username}/{size}/{uploadid}_{version}.png

где для каждого отображаемого аватара происходит обращение к Rails (до кэширования на стороне клиента).

И, если я правильно понимаю код, даже есть настройка, позволяющая использовать редирект вместо проксирования, но в этом случае запрос всё равно уже достигает Rails, а редирект лишь увеличивает время загрузки для клиента.

Разве не было бы быстрее просто указывать ссылки на аватары напрямую в объектное хранилище (возможно, обслуживаемое через CDN), одновременно освобождая ресурсы Rails? /cc @Falco

Это не так. По умолчанию Discourse проксирует запросы на получение аватаров, как вы видите на вашем сайте.

Однако в прошлом году мы добавили настройку, которую можно включить через переменную окружения DISCOURSE_REDIRECT_AVATAR_REQUESTS=1, чтобы активировать поведение, которое вы наблюдаете здесь.

1 лайк