# SSO를 사용하여 이름 제거 허용

**URL:** https://meta.discourse.org/t/allow-name-removal-using-sso/141691
**Category:** Feature
**Created:** [2월 15, 2020, 5:23오후 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691 "2020-02-15T17:23:39Z")
**Posts on this page:** 13
**Page:** 1

<div class="post-metadata">

### Author: ![mentalstring](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mentalstring/32/168934_2.png) [@mentalstring](https://meta.discourse.org/u/mentalstring)
#### Post date: [2월 15, 2020, 5:23오후 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691/1 "2020-02-15T17:23:39Z")

</div>

`/admin/users/sync_sso` 엔드포인트를 사용하여 SSO 데이터를 동기화할 때, 이름이 필수적이지 않더라도 계정에서 이름을 제거할 수 없습니다. 다시 말해, 계정 이름을 무언가에서 아무것도 아닌 것으로 변경할 수 없다는 뜻입니다. 이 문제는 `full_name_required = false`(그리고 `sso_overrides_name = true`)인 상태에서 발생합니다.

문제가 여기 있는 것 같습니다:

> <https://github.com/discourse/discourse/blob/88ecb650a98921e5e3cd345e29f84d9dd204b777/app/models/discourse_single_sign_on.rb#L268>

하지만 제 Ruby/Discourse 지식이 부족해서 PR을 제출하기가 어렵습니다.

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [2월 18, 2020, 9:26오전 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691/2 "2020-02-18T09:26:37Z")

</div>

이것은 #Contribute > Feature 요청처럼 보입니다. 현재 이 같은 경우를 위해 관리자 API를 사용하여 이름을 지울 수 있습니다. 참고:

> [@Reverse engineer the Discourse API](https://meta.discourse.org/t/how-to-reverse-engineer-the-discourse-api/20576):
>
> Discourse is backed by a complete JSON api. Anything you can do on the site you can also do using the JSON api. The API is documented at [docs.discourse.org](https://docs.discourse.org). You can also use the [discourse\_api](https://github.com/discourse/discourse_api) Ruby gem as a client library. However, not every endpoint is documented. To determine how to do something with the JSON API here are some steps you can follow. Example: recategorize a topic. Go to a topic and start editing a category: Open Chrome dev tools, switch to the Network tab, select …

---

<div class="post-metadata">

### Author: ![mentalstring](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mentalstring/32/168934_2.png) [@mentalstring](https://meta.discourse.org/u/mentalstring)
#### Post date: [2월 18, 2020, 9:54오전 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691/3 "2020-02-18T09:54:32Z")

</div>

죄송하지만 동의하지 않습니다. 이것이 버그가 아니라 기능 요청일 수 있다고 보지 않습니다.

다른 API 엔드포인트를 사용할 수 있다는 점은 이해합니다. 하지만 `/admin/users/sync_sso`의 핵심 목적은 바로 이러한 데이터를 동기화 상태로 유지하는 것입니다. 계정 이름 필드를 설정할 수 있는 기능은 이미 존재하며 잘 작동합니다. 그러나 이름은 항상 필수 필드라고 가정하며 빈 값으로 설정하는 것을 허용하지 않습니다. 따라서 이를 통해 데이터를 동기화 상태로 유지할 수 없습니다.

아래 코드는 제 샌드박스 환경에서 예상대로 작동하는 것 같습니다. 하지만 아직 PR을 제출할 만큼 자신감이 부족합니다. 자유롭게 사용하거나 수정해 주십시오.

```plaintext
- if SiteSetting.sso_overrides_name && user.name != name && name.present?
- user.name = name || User.suggest_name(username.blank? ? email : username)
+ if SiteSetting.sso_overrides_name && user.name != name
+ if SiteSetting.full_name_required && name.present?
+ user.name = name || User.suggest_name(username.blank? ? email : username)
+ else
+ user.name = name
+ end

```

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [2월 18, 2020, 9:57오전 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691/4 "2020-02-18T09:57:40Z")

</div>

기능 요청 사항입니다. 의미론적으로 모호한 부분이 있습니다. 이름이 없는 것은 다음 두 가지 의미를 가질 수 있습니다.

1. 이름을 지우기
2. 이름을 기존 그대로 유지하기

여기서 프로토콜 변경을 요청하고 계신 것입니다. 저는 일반적으로 명시성을 선호하므로, 혼동스러운 API를 피하고 싶습니다.

---

<div class="post-metadata">

### Author: ![mentalstring](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mentalstring/32/168934_2.png) [@mentalstring](https://meta.discourse.org/u/mentalstring)
#### Post date: [2월 18, 2020, 10:42오전 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691/5 "2020-02-18T10:42:20Z")

</div>

이제 말씀하시는 의도를 이해했습니다.

다시 한번 말하지만, 내부 구조(또는 Ruby)에 대해 충분히 잘 알지 못합니다… 그런데 해당 요청에서 `name` 필드가 제공되었는지 여부를 알 수 있는 방법이 없나요? 아예 존재하지 않는 경우, 계정 객체의 name 필드를 건드리지 마세요. name 필드가 제공된 경우, 값을 설정하세요(빈 값인 경우, 값을 비웁니다). 제공된 필드만 동기화되는 그 프로토콜/행동을 따르는 것 아닌가요?

이해한 범위 내에서 파악하려고 노력하고 있어서 말이 안 되는 것 같다면 죄송합니다.

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [2월 19, 2020, 9:00오전 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691/6 "2020-02-19T09:00:43Z")

</div>

문제는 현재 “name” 매개변수가 존재하지만 값이 공백인 경우와 “name” 매개변수가 없는 경우가 동일한 의미를 가진다는 점입니다. 즉, 이름 필드를 건드리지 않습니다.

여기서 변경을 가하는 것은 프로토콜 의미론(semantics)의 변경을 의미합니다. 아마도 `name=`은 이름을 공백으로 설정하고, `name`이 없으면 "이름을 건드리지 않는다"는 의미로 변경할 수 있을 것입니다. 하지만 이미 많은 사람들이 기존 동작에 의존하고 있으므로, 이는 기술적으로 호환성 깨짐(breaking change)에 해당합니다.

왜 이름을 제거하려 하는지 설명해 주시겠습니까?

---

<div class="post-metadata">

### Author: ![mentalstring](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mentalstring/32/168934_2.png) [@mentalstring](https://meta.discourse.org/u/mentalstring)
#### Post date: [2월 19, 2020, 12:47오후 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691/7 "2020-02-19T12:47:48Z")

</div>

모든 사용자의 이름을 삭제하는 것이 아닙니다 — 사용자는 웹사이트(SSO 제공자)에서 계정을 업데이트할 때마다 자신의 데이터를 직접 갱신합니다. 우리는 `/admin/users/sync_sso`를 통해 Discourse 계정 내 데이터(사용자 이름, 이름, 아바타 등)가 동기화되도록 합니다. 이름은 선택 사항이며 빈 값으로 설정할 수 있습니다.

이 문제가 이름뿐만 아니라 생애사(bio), 아바타 등 다른 항목 업데이트에도 발생한다는 것을 방금 깨달았습니다. 필수 필드인지 여부와 관계없이, SSO 기록이 빈 값으로 업데이트되어야 하는 경우 `/admin/users/sync_sso`를 통해 해당 SSO 기록을 동기화하는 것이 불가능합니다.

기존 동작에 의존하는 사용자가 있을 수 있다는 점은 이해합니다(아직 이 문제가 보고된 적은 없었지만?), 하지만 이것이 프로토콜이라면 SSO 기록 동기화라는 목적을 달성하는 데 상당한 한계가 있는 것으로 보입니다.

---

<div class="post-metadata">

### Author: ![dbrookes](https://avatars.discourse-cdn.com/v4/letter/d/74df32/32.png) [@dbrookes](https://meta.discourse.org/u/dbrookes)
#### Post date: [5월 26, 2020, 1:10오후 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691/8 "2020-05-26T13:10:14Z")

</div>

저도 이 문제로 인해 어려움을 겪고 있습니다. 개별 사용자가 자신의 개인정보(이름, 아바타, 자기소개, 커스텀 필드 등)를 Discourse에서 삭제할 수 없으며, 이로 인해 예상할 수 있는 여러 문제가 발생합니다.

현재 동작 방식의 의미를 변경하는 것에는 동의하지 않지만, SSO 페이로드에서 이러한 속성을 `false`로 설정할 수 있도록 허용하거나, 삭제를 명시적으로 나타내는 유사한 방법을 제공해 주실 수 없을까요?

---

<div class="post-metadata">

### Author: ![mentalstring](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mentalstring/32/168934_2.png) [@mentalstring](https://meta.discourse.org/u/mentalstring)
#### Post date: [3월 24, 2023, 2:56오후 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691/9 "2023-03-24T14:56:26Z")

</div>

이전에는 이 SSO 제한을 우회하기 위해, 이름 필드를 비우기 위해(이름의 새 값이 빈 값인 경우) `/admin/users/sync_sso` 호출을 `/u/{username}` 엔드포인트에 대한 또 다른 호출과 조합하여 실행했습니다.

하지만 최근 버전의 어느 시점부터는 이것도 작동하지 않게 된 것 같습니다. 아마도 이름을 업데이트하기 전에 `sso_overrides_name = true`인지 확인하기 때문일 수 있습니다.

따라서 현재 상태로는 SSO를 사용하고 `sso_overrides_name = true`인 경우, SSO 제공자가 API를 통해 Discourse의 이름 필드를 비우는 것이 불가능해 보입니다.

@sam, 이 문제를 우회할 수 있는 방법을 보실 수 있을까요?

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [3월 27, 2023, 12:33오전 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691/10 "2023-03-27T00:33:05Z")

</div>

우리 sync\_sso 라우트에 추가 파라미터가 필요할 것 같은데, `&clear_name` 같은 걸 추가하면 어떨까요? 확실하지는 않아요. 이건 정말 예외적인 케이스인 것 같아요. 이름이 비어 있는 사용 사례는 어떤 건가요? 이름이 없으면 그냥 사용자명으로 설정하고, UI에서 중복을 억제하는 방식이 나을 수도 있겠네요.

---

<div class="post-metadata">

### Author: ![mentalstring](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mentalstring/32/168934_2.png) [@mentalstring](https://meta.discourse.org/u/mentalstring)
#### Post date: [3월 28, 2023, 8:32오전 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691/11 "2023-03-28T08:32:01Z")

</div>

이것이 에지 케이스라고 생각하는 것이 제게는 이해가 가지 않습니다. 아마도 name이 필수 필드인 상황에 익숙하신 것 같습니다.

우리는 그 반대입니다: username은 모든 사용자가 반드시 가져야 하고, name은 선택 필드입니다(`prioritize_username_in_ux = true`와 `full name required = false`를 사용합니다). 트위터 계정을 생각해 보세요. 모든 사용자는 사용자 이름/핸들(username/handle)을 가져야 하지만, 이름(name)은 선택적으로 가질 수 있습니다. 이름 필드(또는 기타 개인 데이터)를 비우고 싶어 하는 것은 에지 케이스 시나리오라고 생각하지 않습니다.

현재는 한 번 이름을 입력하면 그것을 삭제하는 것이 불가능합니다. 이것은 우리가 추가 API 호출을 통해 사용자를 업데이트함으로써 우회했던 `sync_sso`의 한계였지만, 이제 그것도 작동하지 않습니다.

> [@sam](#):
>
> 없다면 username으로 설정하고 UI에서 중복을 억제하는 것이 좋을 수도 있습니다.

그것을 고려해 보았지만, 이는 일부 사용자로 하여금 자신의 username이 실제 이름이라고 가정하게 만듭니다: 우리는 국제 포럼을 운영하며, 인터페이스에서의 위치를 제외하고는 어떤 것이 사람의 이름이고 어떤 것이 username인지 종종 명확하지 않습니다.

> [@sam](#):
>
> `&clear_name` 같은 것, 확실하지 않네요

기억이 정확하다면, `sync_sso`를 통해 아바타를 제거하는 데에도 정확히 동일한 문제가 발생한다고 언급해야 합니다. 그것도 작동하지 않는다고 생각하기 때문입니다 — 우리는 기본 아바타를 위한 자체 URL을 제공하여 그 문제를 우회하고 있습니다.

어떤 방식으로든 비울 수 없는 필드가 여러 개라면, 비울/초기화할 필드들의 배열(또는 CSV 목록)을 허용하는 것은 어떨까요?

---

<div class="post-metadata">

### Author: ![masto](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/masto/32/290624_2.png) [@masto](https://meta.discourse.org/u/masto)
#### Post date: [8월 11, 2025, 3:01오후 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691/12 "2025-08-11T15:01:14Z")

</div>

이를 실현하기 위한 방법에 대해 합의하려면 어떤 조치가 필요할까요? 제 쪽에서 어떤 구현이든 기꺼이 수행할 준비가 되어 있습니다: 새로운 파라미터, 특수 값, 두 번째 API 호출 등. 하지만 현재 상황은 제 관점에서는 에지 케이스가 아닙니다. 위 @mentalstring 님과 마찬가지로, 저는 외부의 단일 진실 공급원(source of truth)과 동기화를 하고 있는데, 여기서 프로필 사진과 표시 이름 설정은 선택 사항입니다. 사용자는 이들을 설정하지 않아도 됩니다. Discourse도 미설정 상태를 허용합니다. SSO를 사용하지 않는다면 자유롭게 설정하고 제거할 수 있습니다. 하지만 [DiscourseConnect](https://meta.discourse.org/t/13045?silent=true)는 이를 깨뜨립니다: 일단 설정된 후에는 절대 제거할 수 없는데, 이는 제 생각에 (매우 작은) 버그입니다.

현재 빈 값이 '변경 없음’을 의미하는 프로토콜을 변경하는 것에 대한 우려는 이해합니다. 개인적으로는 동의하지 않습니다. 프로토콜을 해석하는 직관적이고 합리적인 방식이며, 위험은 매우 작다고 생각합니다. 시스템이 항상 name과 avatar\_url 값을 보내지만, 때로는 빈 값으로 설정하여 기존 값을 유지하길 기대하도록 구현되어 있다면 그것은 매우 이상할 것입니다. 그리고 만약 그런 시스템이 있다면, 그 결과는 이름과 아바타가 해제되는 것뿐이며, 쉬운 수정으로 해결될 수 있습니다.

어쨌든, 그 점에 대해 논쟁하고 싶지는 않지만, 이것이 필수적인 기능임을 주장하고 싶습니다. PR을 작성할 의향이 있으며, 어떤 해결책이 수용될지 알고 싶습니다.

미리 감사드립니다.

---

<div class="post-metadata">

### Author: ![mentalstring](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mentalstring/32/168934_2.png) [@mentalstring](https://meta.discourse.org/u/mentalstring)
#### Post date: [8월 11, 2025, 3:48오후 UTC](https://meta.discourse.org/t/allow-name-removal-using-sso/141691/13 "2025-08-11T15:48:41Z")

</div>

이 문제가 최소한 `name`과 `avatar_url`에서 발생하며, 다른 필드(예: `website`?)에서도 발생할 수 있으므로, 여러 개의 개별 `clear_x` 매개변수 대신 지울 필드 목록을 받는 `reset_fields` 매개변수를 도입하는 것이 어떨까요?

우리 입장에서는 `/u/{username}` 엔드포인트에 추가 호출을 통해 문제를 해결할 수만 있으면 유용할 것 같지만, 어느 시점부터는 그마저도 불가능해졌습니다.
