SSO 및 외부 아바타

SSO를 sso overrides avatar: true와 함께 사용할 때, Discourse는 아바타를 다운로드하여 제공된 URL에 직접 링크하는 대신 항상 로컬에서 제공하는 것 같습니다.

제공된 avatar_url에서 아바타를 직접 서빙하도록 허용하는 것이 더 합리적이지 않을까요? 현재 방식은 표시되는 각 아바타마다 Discourse 백엔드를 다소 불필요하게 호출하게 됩니다. 이것이 SSO 옵션으로 추가될 수 있을까요?

아바타가 사라질 수 있다는 우려라면, 이미지의 onerror 이벤트를 사용하여 src를 로컬로 다운로드된 복사본(또는 기본 아바타)으로 폴백 처리하면 됩니다. 다만, 너무 큰 아바타 이미지를 CSS만으로 제한할 수 있는지는 잘 모르겠습니다.

1개의 좋아요

download_remote_images_to_local을 비활성화하면 문제가 해결될 것으로 생각됩니다. 다만 이 경우 게시물 내 이미지가 로컬이 아닌 원격으로 제공되게 됩니다.

그것은 게시물에 있는 이미지에만 적용되는 것 같습니다. 또는 SSO에 의해 덮어쓰지 않은 경우 로컬 아바타에도 적용될 수 있습니다.

1개의 좋아요

흥미롭네요. OIDC 플러그인이 모든 로그인 시 이메일을 덮어쓸 수 있다는 것을 알고 있습니다. 아바타도 SSO에 의해 덮어쓰기 가능하도록 이와 유사한 기능이 구현될 수 있을 것 같습니다.

SSO 아바타가 https://central.avatar.service/<username> 형식이라면, external_system_avatars_url 사이트 설정을 사용하여 이 기능을 사용할 수 있습니다.

우리의 경우에는 해당되지 않습니다(S3에서 제공되므로) — 그리고 효율적으로 캐싱할 수 있도록 그 형식으로 제공되는 경우는 드물 것입니다.

몇 년 전에 이 문제를 다시 살펴보니, 이전에 무언가를 잘못 이해했던 것 같지만, 여전히 성능 측면에서 쉽게 개선할 수 있는 부분이 있다고 생각합니다.

예전에는 아바타가 로컬에 저장된다고(디스코urs 서버 자체에) 생각했고, 왜 SSO 외부 아바타 URL에서 직접 서빙되지 않고 디스코urs에 요청이 가는지 궁금해했습니다. 하지만 직접 확인해 보니, SSO에서 오는 외부 아바타는 이미 객체 저장소(예: S3)에 업로드되어 있으며, 필요한 여러 크기로 변환되어 있는 것을 알게 되었습니다.

제가 이해한 바로는, 현재 디스코urs는 객체 저장소에서 클라이언트로 아바타를 프록시하고 있습니다. 하지만 이 동작은 SSO 외부 아바타를 사용할 때에만 해당되는 것 같습니다. 왜냐하면 메타(meta)에서 아바타는 (CDN이 적용된) 객체 저장소에서 직접 서빙되고 있기 때문입니다. 그러나 SSO를 외부 URL과 함께 사용할 경우, 아바타 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개의 좋아요