API를 통한 사용자 아바타 선택이 더 이상 작동하지 않음

안녕하세요, 여러분. 제 포럼에서 SSO를 사용 중이며 아바타는 제 웹사이트에서 관리되고 있습니다.

며칠 전까지는 웹사이트에서 Discourse로 API를 통해 아바타를 업로드하거나 업데이트하는 것이 정상적으로 작동했습니다. 그런데 지금은 422 - Unprocessable Entity 오류가 발생합니다.

문제를 디버깅해 보았고 Postman으로 테스트를 해 보았지만 동일한 문제가 발생합니다. 제가 보내는 요청은 다음과 같습니다(물론 URL, 사용자 이름, api_key는 제거했습니다).

Discourse의 이 부분에 문제가 있는지 아시는 분이 있을까요?

미리 감사합니다.

제 예시:

curl --location --request PUT 'https://{{URL}}/u/{{USERNAME}}/preferences/avatar/pick' \
--header 'Api-Key: {{API_KEY}}' \
--header 'Api-Username: system' \
--header 'Content-Type: application/json' \
--data-raw '{
"upload_id": 972,
"type": "uploaded"
}'

누군가요? 같은 문제를 발견한 분이 없나요?

이것은 아마도 S3로 직접 업로드하도록 API를 변경한 것과 관련이 있을 것 같습니다.

그것은 아바타를 사용자에게 할당하는 것이 아니라 실제 업로드에 간섭을 일으킬 것이라고 생각합니다.

파일 자체는 아무 문제 없이 업로드할 수 있습니다. API를 호출하여 어떤 파일을 아바타로 사용할지 지정할 때 오류가 발생하는데, 이건 갑자기 시작되었습니다.

한 번 더 운을 걸고 이 문제를 부스트해 보겠습니다. 아무도 이 문제를 발견하지 못했다는 게 좀 이상하네요. 이미 몇 년 동안 정상적으로 작동해 왔으니 코딩 문제일 리는 없다고 확신합니다.

이 문제는 discourse connect overrides avatar 사이트 설정 때문인 것 같습니다.

DiscourseConnect 페이로드의 값으로 사용자 아바타를 덮어씁니다. 활성화된 경우, 사용자는 Discourse에서 아바타를 업로드할 수 없습니다.

저희 로컬 환경에서 해당 설정을 해제하면 API를 통해 아바타를 업데이트할 때 200 HTTP 응답을 받습니다:

curl -i -sS -X PUT "http://localhost:4200/u/10614bb2d4eacd328c45/preferences/avatar/pick.json"  \
-H "Content-Type: multipart/form-data"  \
-H "Api-Key: 6cea489d21282803c446fd2e9d236901c3d186f36079911833db4b57c43c01d5"  \
-H "Api-Username: blake.erickson"  \
-F "upload_id=57"  \
-F "type=uploaded"

HTTP/1.1 200 OK

해당 설정을 체크하면 422 오류가 발생합니다:

curl -i -sS -X PUT "http://localhost:4200/u/021ca796a01ad178bc52/preferences/avatar/pick.json"  \
-H "Content-Type: multipart/form-data"  \
-H "Api-Key: 6cea489d21282803c446fd2e9d236901c3d186f36079911833db4b57c43c01d5"  \
-H "Api-Username: blake.erickson"  \
-F "upload_id=57"  \
-F "type=uploaded"

HTTP/1.1 422 Unprocessable Entity

블레이크, 도와줘서 고마워.

불행히도 활성화하거나 비활성화하는 건 차이가 없어.

아직 정확한 답변은 없지만, 이 문제를 확인하기 위해 목록에 올려두었다는 점만 알려드리고 싶었습니다. 로컬에서 테스트할 수 있는 SSO 설정이 있으니, 우리 설정이 일치하도록 조정할 수 있을 것 같습니다. 해당 사이트 설정은 누군가가 최근에 변경했을 가능성이 있으므로 이를 존중해야 할 것 같지만, API 오버라이드를 추가하는 것도 고려해볼 수 있을 것 같습니다.

블레이크, 정말 감사합니다. 제가 도와드릴 일이 있으면 말씀해 주세요.

해당 메서드에서 422 오류가 발생하는 또 다른 이유는 allow_uploaded_avatars 설정이 false인 경우일 수 있습니다. 아마도 그게 문제일 겁니다.

리처드님, 안녕하세요! 의견 주셔서 감사합니다.

저도 그 부분을 생각해 보았지만 작동하지 않았습니다. 게다가 이 문제는 갑자기 발생했습니다. 아무도 아무것도 변경하지 않았습니다(관리자는 저 혼자라 누군가가 설정을 바꿨을 가능성은 전혀 없습니다), 메인 웹사이트 코드 변경도 없었고, 아무것도 없었습니다.

allow_uploaded_avatars 설정 값이 무엇인지 알려주실 수 있나요? 이제 단순히 true/false 설정이 아니라 특정 신뢰 수준(trust level)으로 설정됩니다. 또한 아바타를 변경하려는 사용자의 신뢰 수준이 무엇인지도 알려주시기 바랍니다. 그리고 현재 Discourse의 최신 버전을 사용 중이신가요?

아바타를 선택하는 코드와 422 응답을 반환하는 라인들이 다음과 같습니다.

코드베이스의 다른 깊은 부분에 문제가 있을 수도 있지만, 아마도 이 세 가지 중 하나일 가능성이 높습니다. 첫 번째는 discourse_connect_overrides_avatar와 관련이 있으며, 우리는 이미 그 가능성을 배제했습니다. 두 번째는 아닐 것 같습니다. 왜냐하면 제공해주신 curl 명령어가 정확해 보이고 “uploaded” 타입을 포함하고 있기 때문입니다. 따라서 allow_uploaded_avatars 설정과 관련된 세 번째일 수도 있으며, 이것이 제가 해당 설정 값을 확인하고 싶은 이유입니다.

이 문제가 생기기 전까지는 비활성화해 두었습니다. 그러다 0:new user로 변경했습니다.

하지만 비활성화해 두는 것이 항상 제게는 잘 작동했습니다. 실제로 사용자가 포럼에서 업로드하는 것이 아니라, SSO를 사용하는 웹사이트에서 업로드하길 원합니다. 그런데 0:new user로 변경해도 아무런 변화가 없습니다. 여전히 같은 오류가 발생합니다 :frowning:

사이트 설정에서 아바타가 모두 차단된 상태에서도 API를 통해 아바타가 작동하지 않도록 막았을 것으로 보이는 최근 업데이트를 찾을 수 없습니다. 어쨌든 SSO(또는 DiscourseConnect)를 사용 중이라면, UI 경로(/u/username/preferences/avatar/pick)가 아닌 /admin/users/sync_sso API 경로를 사용하여 사용자 아바타를 업데이트해야 합니다.

요청 본문(request body)에 다음 매개변수를 전달하세요:

avatar_url: "url-of-image",
avatar_force_update: "true"

Blake님, 이 사안에 대해 계속 도움을 주셔서 정말 감사합니다.

API 문서에서 해당 엔드포인트에 대한 정보를 찾을 수 없습니다. 새로운 기능인가요?

또한, 이전에 말씀드린 것처럼 /u/username/preferences/avatar 엔드포인트를 사용해 아바타 업데이트가 몇 달간 정상적으로 작동했는데, 갑자기 멈췄습니다. 정말 이상합니다. 이 부분이 제게 큰 의문입니다.

네, 실제로는 문서에 포함되는 것이 맞습니다. 새로운 내용은 아니지만, 다른 엔드포인트들과는 조금 다릅니다.

아래 링크에서 관련 정보를 찾을 수 있습니다: Setup DiscourseConnect - Official Single-Sign-On for Discourse (sso)

또한 discourse_api 루비 지엠이 sync_sso 엔드포인트를 어떻게 사용하는지도 확인해 보세요: discourse_api/lib/discourse_api/single_sign_on.rb at main · discourse/discourse_api · GitHub 및 discourse_api/lib/discourse_api/api/sso.rb at main · discourse/discourse_api · GitHub

SSO 제공자가 사용하는 것과 동일한 SSO 시크릿을 사용해야 합니다.

블레이크, 감사합니다.

그 엔드포인트를 사용해도 여전히 422 에러가 여기저기서 나는데, 아무 이유 없이 갑자기 동작이 멈춘 것이 이해가 되지 않습니다.

다른 해결책을 찾아보겠습니다.

시간 내어 주셔서 정말 감사합니다.