SCIM 사용 예시를 보여주는 12분짜리 영상을 시청하세요
System for Cross-domain Identity Management(SCIM) API를 사용하면 인스턴스 또는 조직 관리자가 W&B 조직 내의 사용자, 그룹, 커스텀 역할을 관리할 수 있습니다. SCIM 그룹은 W&B Teams에 매핑됩니다.
W&B의 SCIM API는 Okta를 포함한 주요 아이덴티티 공급자와 호환되며, 사용자를 자동으로 프로비저닝하고 프로비저닝 해제할 수 있습니다. Okta 및 기타 아이덴티티 공급자와의 SSO 설정은 SSO 문서를 참고하세요.
SCIM API와 상호작용하는 방법을 보여주는 실용적인 Python 예제는 wandb-scim 리포지토리를 참고하세요.
- Filtering: API는
/Users 및 /Groups 엔드포인트에 대한 필터링을 지원합니다.
- PATCH Operations: 리소스를 부분적으로 업데이트하기 위한 PATCH를 지원합니다.
- ETag Support: 충돌 감지를 위해 ETag를 사용한 조건부 업데이트를 지원합니다.
- Service Account Authentication: 조직 서비스 계정이 API에 액세스할 수 있습니다.
여러 Enterprise Multi-tenant SaaS 조직의 관리자라면, SCIM API 요청을 보낼 조직을 반드시 먼저 지정해야 합니다. 그래야 API 키를 사용해 전송하는 SCIM API 요청이 올바른 조직에 적용됩니다. 프로필 이미지를 클릭한 다음 User Settings를 클릭하고 Default API organization 설정을 확인합니다.선택한 호스팅 옵션에 따라 이 페이지의 예시에서 사용하는 <host-url> 플레이스홀더 값이 결정됩니다.또한 예시에서는 abc 및 def와 같은 사용자 ID를 사용합니다. 실제 요청과 응답에서는 사용자 ID에 대해 해시된 값이 사용됩니다.
핵심 차이점을 검토한 후, 사용자 ID 또는 서비스 계정을 사용해 인증 방식을 선택하세요.
- 사용 대상: Users는 인터랙티브한 단발성 관리자 작업에 적합하고, 서비스 계정은 자동화 및 인테그레이션(CI/CD, 프로비저닝 도구)에 가장 적합합니다.
- 자격 증명: Users는 사용자 이름과 API 키를 전송하고, 서비스 계정은 API 키만 전송합니다(사용자 이름 없음).
- Authorization 헤더의 페이로드: Users는
username:API-KEY를 인코딩하고, 서비스 계정은 :API-KEY(앞에 콜론 포함)를 인코딩합니다.
- 범위와 권한: 둘 다 관리자 권한이 필요합니다. 서비스 계정은 조직 범위이고 별도 사용자 없이(headless) 동작하므로, 자동화를 위한 감사 추적을 더 명확하게 제공합니다.
- 자격 증명 얻는 위치: Users는 User Settings에서 자신의 API 키를 복사하고, 서비스 계정 키는 조직의 Service account 탭에 있습니다.
- Multi-tenant Cloud: 둘 이상의 Multi-tenant Cloud 조직에 액세스할 수 있는 경우, SCIM API 호출이 의도한 조직으로 라우팅되도록 Default API organization을 반드시 설정해야 합니다.
대화형 관리 작업을 수행할 때는 개인 관리자 자격 증명을 사용하세요. HTTP Authorization 헤더를 Basic <base64(username:API-KEY)> 형식으로 구성하세요.
예를 들어, demo:p@55w0rd로 인증하려면 다음과 같습니다:
Authorization: Basic ZGVtbzpwQDU1dzByZA==
자동화 또는 인테그레이션을 위해 조직 범위의 서비스 계정을 사용하세요. HTTP Authorization 헤더를 Basic <base64(:API-KEY)> 형식으로 구성합니다(앞에 오는 콜론과 비어 있는 사용자 이름 부분에 유의하세요). 조직 대시보드의 Service account 탭에서 서비스 계정 API 키를 찾을 수 있습니다. Organization-scoped service accounts를 참고하세요.
예를 들어, API 키 sa-p@55w0rd로 인증하려면 다음과 같이 합니다:
Authorization: Basic OnNhLXBANTV3MHJk
SCIM 사용자 리소스는 W&B 사용자에 매핑됩니다. 조직의 사용자를 관리하려면 이러한 엔드포인트를 사용하세요.
조직 내 특정 사용자의 정보를 조회합니다.
이 작업으로는 서비스 계정 정보를 조회할 수 없습니다.
- URL:
<host-url>/scim/Users/{id}
- Method: GET
| 매개변수 | 유형 | 필수 여부 | 설명 |
|---|
id | string | 예 | 사용자의 고유 ID |
{
"active": true,
"daysActive": 42,
"displayName": "Dev User 1",
"emails": {
"Value": "dev-user1@example.com",
"Display": "",
"Type": "",
"Primary": true
},
"id": "abc",
"lastActiveAt": "2023-10-15T14:32:10Z",
"meta": {
"resourceType": "User",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:00:00Z",
"location": "Users/abc"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"userName": "dev-user1"
}
응답에는 조직 내에서 사용자의 활동에 대한 세부 정보가 포함됩니다.
daysActive: 해당 사용자가 조직에서 활동한 전체 일수입니다.
lastActiveAt: 사용자의 가장 최근 활동 시점을 나타내는 ISO 8601 타임스탬프입니다. 사용자가 한 번도 활동한 적이 없다면 null을 반환합니다.
“활성”의 정의는 배포 유형에 따라 다릅니다.
- Dedicated Cloud / Self-Managed: 사용자가 로그인하거나, W&B App의 어떤 페이지든 열거나, run을 기록하거나, SDK를 사용하거나, 기타 어떤 방식으로든 W&B 서버와 상호작용하면 활성으로 간주됩니다.
- Multi-tenant Cloud: 사용자가 2025년 5월 8일 이후에 조직 범위에서 감사 가능한 작업을 수행하면 활성으로 간주됩니다. 전체 목록은 Audit logging actions를 참조하세요.
조직 내 모든 사용자를 목록으로 조회합니다.
이 작업에서는 서비스 계정이 포함되지 않습니다.
/Users 엔드포인트에서는 사용자 이름이나 이메일로 사용자를 필터링할 수 있습니다.
userName eq "value" - 사용자 이름으로 필터링
emails.value eq "value" - 이메일 주소로 필터링
예제
GET /scim/Users?filter=userName eq "john.doe"
GET /scim/Users?filter=emails.value eq "john@example.com"
- URL:
<host-url>/scim/Users
- 메서드: GET
List Users 요청
List Users 응답
{
"Resources": [
{
"active": true,
"daysActive": 42,
"displayName": "Dev User 1",
"emails": {
"Value": "dev-user1@example.com",
"Display": "",
"Type": "",
"Primary": true
},
"id": "abc",
"lastActiveAt": "2023-10-15T14:32:10Z",
"meta": {
"resourceType": "User",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:00:00Z",
"location": "Users/abc"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"userName": "dev-user1"
}
],
"itemsPerPage": 9999,
"schemas": [
"urn:ietf:params:scim:api:messages:2.0:ListResponse"
],
"startIndex": 1,
"totalResults": 1
}
응답에는 조직 내 각 사용자의 활동에 대한 세부 정보가 포함됩니다.
daysActive: 사용자가 조직에서 활동한 총 일수입니다.
lastActiveAt: 사용자의 가장 최근 활동 시각을 나타내는 ISO 8601 타임스탬프입니다. 사용자가 한 번도 활동한 적이 없으면 null을 반환합니다.
“활성”의 정의는 배포 유형에 따라 다릅니다.
- Dedicated Cloud / Self-Managed: 사용자가 로그인하거나, W&B App의 아무 페이지나 열거나, run을 로깅하거나, SDK를 사용하거나, 어떤 방식으로든 W&B 서버와 상호작용하면 활성 상태로 간주됩니다.
- Multi-tenant Cloud: 사용자가 2025년 5월 8일 이후에 조직 범위의 감사 가능 작업을 수행하면 활성 상태로 간주됩니다. 전체 목록은 감사 로깅 작업을 참조하세요.
조직에 새 사용자를 추가합니다.
- URL:
<host-url>/scim/Users
- Method: POST
| Parameter | Type | Required | Description |
|---|
emails | array | Yes | 이메일 객체의 배열입니다. 기본 이메일(primary email)을 포함해야 합니다. |
userName | string | Yes | 새 사용자의 사용자 이름입니다. |
{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"emails": [
{
"primary": true,
"value": "dev-user2@example.com"
}
],
"userName": "dev-user2"
}
{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User",
"urn:ietf:params:scim:schemas:extension:teams:2.0:User"
],
"emails": [
{
"primary": true,
"value": "dev-user2@example.com"
}
],
"userName": "dev-user2",
"urn:ietf:params:scim:schemas:extension:teams:2.0:User": {
"teams": ["my-team"]
}
}
{
"active": true,
"displayName": "Dev User 2",
"emails": {
"Value": "dev-user2@example.com",
"Display": "",
"Type": "",
"Primary": true
},
"id": "def",
"meta": {
"resourceType": "User",
"created": "2023-10-01T00:00:00Z",
"location": "Users/def"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"userName": "dev-user2"
}
{
"active": true,
"displayName": "Dev User 2",
"emails": {
"Value": "dev-user2@example.com",
"Display": "",
"Type": "",
"Primary": true
},
"id": "def",
"meta": {
"resourceType": "User",
"created": "2023-10-01T00:00:00Z",
"location": "Users/def"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User",
"urn:ietf:params:scim:schemas:extension:teams:2.0:User"
],
"userName": "dev-user2",
"organizationRole": "member",
"teamRoles": [
{
"teamName": "my-team",
"roleName": "member"
}
],
"groups": [
{
"value": "my-team-id"
}
]
}
관리자 액세스 유지항상 인스턴스 또는 조직에 최소 한 명의 관리자 사용자가 존재하도록 해야 합니다. 그렇지 않으면 어떤 사용자도 조직의 W&B 계정을 구성하거나 유지 관리할 수 없습니다. 조직에서 SCIM 또는 기타 자동화된 프로세스를 사용해 W&B에서 사용자의 프로비저닝을 해제하는 경우, 프로비저닝 해제 작업으로 인해 인스턴스 또는 조직에서 마지막으로 남은 관리자가 실수로 제거될 수 있습니다.운영 절차를 수립하는 데 도움이 필요하거나 관리자 액세스를 복구해야 하는 경우 지원팀에 문의하십시오.
조직에서 사용자를 완전히 삭제합니다.
이 작업은 서비스 계정이 아닌 사용자에게만 적용됩니다. 서비스 계정은 W&B Team 설정에서 삭제하십시오.
- URL:
<host-url>/scim/Users/{id}
- Method: DELETE
| 매개변수 | 타입 | 필수 여부 | 설명 |
|---|
id | string | 예 | 삭제할 사용자의 고유 ID |
사용자를 일시적으로 비활성화하려면 PATCH 엔드포인트를 사용하는 사용자 비활성화 API를 참조하세요.
사용자의 기본 이메일 주소를 업데이트합니다.
조직에서 사용자 계정을 관리하지 않는 멀티 테넌트 클라우드(Multi-tenant Cloud) 환경에서는 사용할 수 없습니다.
- URL:
<host-url>/scim/Users/{id}
- Method: PATCH
| 매개변수 | 유형 | 필수 여부 | 설명 |
|---|
id | string | 예 | 사용자의 고유 ID |
op | string | 예 | replace |
path | string | 예 | emails |
value | array | 예 | 새 이메일 객체가 담긴 배열 |
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "emails",
"value": [
{
"value": "newemail@example.com",
"primary": true
}
]
}
]
}
{
"active": true,
"displayName": "Dev User 1",
"emails": {
"Value": "newemail@example.com",
"Display": "",
"Type": "",
"Primary": true
},
"id": "abc",
"meta": {
"resourceType": "User",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:00:00Z",
"location": "Users/abc"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"userName": "dev-user1"
}
사용자의 표시 이름을 업데이트합니다.
조직에서 사용자 계정을 관리하지 않는 Multi-tenant Cloud 환경에서는 지원되지 않습니다.
- URL:
<host-url>/scim/Users/{id}
- Method: PATCH
| 매개변수 | 유형 | 필수 여부 | 설명 |
|---|
id | string | 예 | 사용자의 고유 ID |
op | string | 예 | replace |
path | string | 예 | displayName |
value | string | 예 | 새 표시 이름 |
표시 이름 업데이트 요청
표시 이름 업데이트 응답
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "displayName",
"value": "John Doe"
}
]
}
{
"active": true,
"displayName": "John Doe",
"emails": {
"Value": "dev-user1@example.com",
"Display": "",
"Type": "",
"Primary": true
},
"id": "abc",
"meta": {
"resourceType": "User",
"created": "2025-7-01T00:00:00Z",
"lastModified": "2025-7-01T00:00:00Z",
"location": "users/dev-user1"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"userName": "dev-user1"
}
조직의 사용자를 비활성화합니다. 실제 결과는 배포 유형에 따라 다릅니다:
- Dedicated Cloud / Self-Managed: 사용자의
active 필드를 false로 설정합니다. 비활성화된 사용자가 다시 조직에 접근할 수 있도록 하려면 사용자 재활성화를 참조하세요.
- Multi-tenant Cloud: 사용자를 조직에서 제거합니다. 사용자의 접근 권한을 복구하려면 해당 사용자를 조직에 다시 추가하세요. 사용자 생성을 참조하세요. Multi-tenant Cloud에서는 사용자의 계정이 조직에서 관리되지 않습니다.
이 작업은 사용자에게만 적용되며, 서비스 계정에는 적용되지 않습니다. 서비스 계정 비활성화는 지원되지 않습니다. 팀 서비스 계정은 W&B Team 설정에서 관리하세요.
- URL:
<host-url>/scim/Users/{id}
- Method: PATCH
| 매개변수 | 타입 | 필수 여부 | 설명 |
|---|
id | string | 예 | 비활성화할 사용자의 고유 ID |
op | string | 예 | replace |
value | object | 예 | {"active": false}를 포함하는 객체 |
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"value": {"active": false}
}
]
}
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"value": {"active": false}
}
]
}
사용자 비활성화 응답 (전용/자가 관리형)
사용자 비활성화 응답 (멀티테넌트)
{
"active": false,
"displayName": "Dev User 1",
"emails": {
"Value": "dev-user1@example.com",
"Display": "",
"Type": "",
"Primary": true
},
"id": "abc",
"meta": {
"resourceType": "User",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:00:00Z",
"location": "Users/abc"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"userName": "dev-user1"
}
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"value": {"active": true}
}
]
}
조직에서 이전에 비활성화한 사용자를 다시 활성화합니다.
-
사용자 재활성화는 서비스 계정이 아닌 사용자에게만 적용됩니다. 서비스 계정에는 재활성화가 지원되지 않습니다. 서비스 계정은 W&B Team 설정에서 관리하세요.
-
Multi-tenant Cloud에서는 사용자 재활성화가 지원되지 않습니다. 사용자의 접근 권한을 복원하려면 해당 사용자를 조직에 다시 추가해야 합니다. 사용자 생성을 참조하세요. Multi-tenant Cloud에서는 사용자의 계정을 조직에서 관리하지 않습니다. 사용자를 재활성화하려고 시도하면 HTTP
400 오류가 발생합니다:
{
"schemas": [
"urn:ietf:params:scim:api:messages:2.0:Error"
],
"detail": "User reactivation operations are not supported in SaaS Cloud",
"status": "400"
}
- URL:
<host-url>/scim/Users/{id}
- 메서드: PATCH
| 매개변수 | 타입 | 필수 여부 | 설명 |
|---|
id | string | 예 | 재활성화할 사용자의 고유 ID |
op | string | 예 | replace |
value | object | 예 | {"active": true} 속성을 가진 객체 |
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"value": {"active": true}
}
]
}
{
"active": true,
"displayName": "Dev User 1",
"emails": {
"Value": "dev-user1@example.com",
"Display": "",
"Type": "",
"Primary": true
},
"id": "abc",
"meta": {
"resourceType": "User",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:00:00Z",
"location": "Users/abc"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"userName": "dev-user1"
}
조직 수준 역할을 사용자에게 할당합니다.
이 작업은 사용자에게만 적용되며 서비스 계정에는 적용되지 않습니다. 서비스 계정에서는 사용자 지정 역할을 지원하지 않습니다.
- URL:
<host-url>/scim/Users/{id}
- Method: PATCH
| Parameter | Type | Required | Description |
|---|
id | string | Yes | 사용자의 고유 ID |
op | string | Yes | replace |
path | string | Yes | organizationRole |
value | string | Yes | 역할 이름(admin 또는 member) |
조직 범위의 viewer 역할은 사용 중단되었으며, 이제 UI에서 할당할 수 없습니다. SCIM을 사용해 사용자에게 viewer 역할을 할당하는 경우:
- 조직에서는
member 역할이 할당됩니다.
full 좌석 대신 Models viewer 좌석이 할당됩니다. 이를 통해 Models에는 읽기 전용으로만 액세스할 수 있고, Registry에는 전체 액세스가 허용됩니다. 사용 가능한 Models 좌석이 없는 경우 Seat limit reached 오류가 로그에 기록되고, 해당 멤버는 Models 액세스 없이 추가됩니다. 이후 좌석이 확보되면 업데이트할 수 있습니다.
full 좌석 대신 Weave viewer 좌석이 할당됩니다. 이를 통해 Weave에는 읽기 전용으로만 액세스할 수 있습니다. 사용 가능한 Weave 좌석이 없는 경우 Seat limit reached 오류가 로그에 기록되고, 해당 멤버는 Weave 액세스 없이 추가됩니다. 이후 좌석이 확보되면 업데이트할 수 있습니다.
- 조직 수준에서 보이는 레지스트리에 대해서는 Registry
viewer 역할이 할당됩니다.
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "organizationRole",
"value": "admin"
}
]
}
{
"active": true,
"displayName": "Dev User 1",
"emails": {
"Value": "dev-user1@example.com",
"Display": "",
"Type": "",
"Primary": true
},
"id": "abc",
"meta": {
"resourceType": "User",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:00:00Z",
"location": "Users/abc"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"userName": "dev-user1",
"teamRoles": [
{
"teamName": "team1",
"roleName": "admin"
}
],
"organizationRole": "admin"
}
팀 수준의 역할을 사용자에게 부여합니다.
이 작업은 서비스 계정이 아닌 사용자에게만 적용됩니다. 서비스 계정에는 사용자 정의 역할이 지원되지 않습니다.
- URL:
<host-url>/scim/Users/{id}
- Method: PATCH
| 매개변수 | 타입 | 필수 여부 | 설명 |
|---|
id | string | 예 | 사용자의 고유 ID |
op | string | 예 | replace |
path | string | 예 | teamRoles |
value | array | 예 | teamName과 roleName이 포함된 객체 배열 |
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "teamRoles",
"value": [
{
"roleName": "admin",
"teamName": "team1"
}
]
}
]
}
{
"active": true,
"displayName": "Dev User 1",
"emails": {
"Value": "dev-user1@example.com",
"Display": "",
"Type": "",
"Primary": true
},
"id": "abc",
"meta": {
"resourceType": "User",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:00:00Z",
"location": "Users/abc"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"userName": "dev-user1",
"teamRoles": [
{
"teamName": "team1",
"roleName": "admin"
}
],
"organizationRole": "admin"
}
레지스트리에 사용자를 추가하고 레지스트리 수준 역할을 부여합니다.
이 작업은 서비스 계정이 아닌 사용자에게만 사용할 수 있습니다. 서비스 계정에는 커스텀 역할이 지원되지 않습니다.
- URL:
<host-url>/scim/Users/{id}
- Method: PATCH
| 매개변수 | 타입 | 필수 | 설명 |
|---|
id | string | 예 | 사용자의 고유 ID |
op | string | 예 | add |
path | string | 예 | registryRoles |
value | array | 예 | registryName과 roleName을(를) 포함하는 객체 배열 |
Registry 추가 요청
Registry 추가 응답
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "registryRoles",
"value": [
{
"roleName": "admin",
"registryName": "hello-registry"
}
]
}
]
}
{
"active": true,
"displayName": "Dev User 1",
"emails": {
"Value": "dev-user1@example.com",
"Display": "",
"Type": "",
"Primary": true
},
"id": "abc",
"meta": {
"resourceType": "User",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:00:00Z",
"location": "Users/abc"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"userName": "dev-user1",
"registryRoles": [
{
"registryName": "hello-registry",
"roleName": "admin"
}
],
"organizationRole": "admin"
}
Registry에서 사용자를 제거합니다.
- 제거 작업은 RFC 7644 SCIM 프로토콜 사양을 따릅니다. 특정 Registry에서 사용자를 제거하려면
"registryRoles[registryName eq \"{registry_name}\"]" 필터 구문을 사용하고, 모든 Registry에서 해당 사용자를 제거하려면 "registryRoles"를 사용하십시오.
- 이 작업은 사용자에 대해서만 동작하며, 서비스 계정에는 적용되지 않습니다. 서비스 계정을 Registry에서 제거하려면 W&B Team 설정에서 제거하십시오.
- URL:
<host-url>/scim/Users/{id}
- 메서드: PATCH
| 매개변수 | 유형 | 필수 여부 | 설명 |
|---|
id | string | 예 | 사용자의 고유 ID |
op | string | 예 | remove |
path | string | 예 | "registryRoles[registryName eq \"{registry_name}\"]" 또는 "registryRoles" |
Registry에서 제거 요청
Registry에서 제거 응답
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "registryRoles[registryName eq \"goodbye-registry\"]"
}
]
}
{
"active": true,
"displayName": "Dev User 1",
"emails": {
"Value": "dev-user1@example.com",
"Display": "",
"Type": "",
"Primary": true
},
"id": "abc",
"meta": {
"resourceType": "User",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:00:00Z",
"location": "Users/abc"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"userName": "dev-user1",
"registryRoles": [
{
"registryName": "hello-registry",
"roleName": "admin"
}
],
"organizationRole": "admin"
}
모든 Registry에서 제거 요청
모든 Registry에서 제거 응답
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "registryRoles"
}
]
}
{
"active": true,
"displayName": "Dev User 1",
"emails": {
"Value": "dev-user1@example.com",
"Display": "",
"Type": "",
"Primary": true
},
"id": "abc",
"meta": {
"resourceType": "User",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:00:00Z",
"location": "Users/abc"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User"
],
"userName": "dev-user1",
"organizationRole": "admin"
}
IAM에서 SCIM 그룹을 생성하면 해당 그룹에 매핑되는 W&B Team이 생성되며, 이후 SCIM 그룹에 대한 다른 작업은 이 팀을 기준으로 수행됩니다.
SCIM을 통해 W&B Team이 생성되면, 서비스 계정의 팀 리소스에 대한 액세스를 유지하기 위해 조직 수준의 모든 서비스 계정이 자동으로 해당 팀에 추가됩니다.
/Groups 엔드포인트는 특정 Teams를 찾기 위한 필터링 기능을 지원합니다:
displayName eq "value" - 팀 표시 이름으로 필터링합니다
GET /scim/Groups?filter=displayName eq "engineering-team"
팀의 고유 ID를 지정하여 팀 정보를 조회합니다.
- URL:
<host-url>/scim/Groups/{id}
- Method: GET
{
"displayName": "acme-devs",
"id": "ghi",
"members": [
{
"Value": "abc",
"Ref": "",
"Type": "",
"Display": "dev-user1"
}
],
"meta": {
"resourceType": "Group",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:00:00Z",
"location": "Groups/ghi"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:Group"
]
}
Teams 목록을 가져옵니다.
- URL:
<host-url>/scim/Groups
- 메서드: GET
{
"Resources": [
{
"displayName": "acme-devs",
"id": "ghi",
"members": [
{
"Value": "abc",
"Ref": "",
"Type": "",
"Display": "dev-user1"
}
],
"meta": {
"resourceType": "Group",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:00:00Z",
"location": "Groups/ghi"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:Group"
]
}
],
"itemsPerPage": 9999,
"schemas": [
"urn:ietf:params:scim:api:messages:2.0:ListResponse"
],
"startIndex": 1,
"totalResults": 1
}
- Endpoint:
<host-url>/scim/Groups
- Method: POST
- Description: 새 팀 리소스를 생성합니다.
- Supported Fields:
| Field | Type | Required |
|---|
displayName | String | Yes |
members | Multi-Valued Array | Yes (value 하위 필드는 필수이며 사용자 ID에 매핑됩니다.) |
dev-user2를 팀 구성원으로 하는 wandb-support라는 팀을 생성합니다.
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
"displayName": "wandb-support",
"members": [
{
"value": "def"
}
]
}
{
"displayName": "wandb-support",
"id": "jkl",
"members": [
{
"Value": "def",
"Ref": "",
"Type": "",
"Display": "dev-user2"
}
],
"meta": {
"resourceType": "Group",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:00:00Z",
"location": "Groups/jkl"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:Group"
]
}
- Endpoint:
<host-url>/scim/Groups/{id}
- Method: PATCH
- Description: 기존 팀의 멤버 목록을 업데이트합니다.
- Supported Operations:
add member, remove member, replace members
-
remove 연산은 RFC 7644 SCIM 프로토콜 명세를 따릅니다. 특정 사용자를 제거하려면 members[value eq "{user_id}"] 필터 문법을 사용하고, 팀에서 모든 사용자를 제거하려면 members를 사용합니다.
사용자 식별: 멤버 관련 작업에서 {user_id}는 다음 중 하나가 될 수 있습니다:
-
이 연산들은 서비스 계정이 아닌 사용자에게만 적용됩니다. 팀의 서비스 계정을 업데이트하려면 W&B Team 설정에서 변경하세요.
요청에서 {team_id}를 실제 팀 ID로, {user_id}를 실제 사용자 ID 또는 이메일 주소로 바꿔서 사용하세요.
팀의 모든 구성원을 새로운 목록으로 교체합니다.
이 작업은 서비스 계정이 아닌 일반 사용자 계정에만 적용됩니다. 서비스 계정은 W&B Team 설정에서 관리하세요.
- Endpoint:
<host-url>/scim/Groups/{id}
- Method: PUT
- Description: 팀 구성원 전체 목록을 교체합니다.
PUT /scim/Groups/{team_id}
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
"displayName": "acme-devs",
"members": [
{
"value": "{user_id_1}"
},
{
"value": "{user_id_2}"
}
]
}
{
"displayName": "acme-devs",
"id": "ghi",
"members": [
{
"Value": "user_id_1",
"Ref": "",
"Type": "",
"Display": "user1"
},
{
"Value": "user_id_2",
"Ref": "",
"Type": "",
"Display": "user2"
}
],
"meta": {
"resourceType": "Group",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:01:00Z",
"location": "Groups/ghi"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:Group"
]
}
팀에 사용자 추가
acme-devs에 dev-user2를 추가하기:
이 작업은 서비스 계정이 아닌 일반 사용자 계정에만 적용됩니다. 서비스 계정은 W&B Team 설정에서 관리하세요.
PATCH /scim/Groups/{team_id}
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "add",
"path": "members",
"value": [
{
"value": "{user_id}"
}
]
}
]
}
{
"displayName": "acme-devs",
"id": "ghi",
"members": [
{
"Value": "abc",
"Ref": "",
"Type": "",
"Display": "dev-user1"
},
{
"Value": "def",
"Ref": "",
"Type": "",
"Display": "dev-user2"
}
],
"meta": {
"resourceType": "Group",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:01:00Z",
"location": "Groups/ghi"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:Group"
]
}
팀에서 특정 사용자 제거
acme-devs에서 dev-user2를 제거하기:
이 작업은 서비스 계정이 아닌 일반 사용자 계정에만 적용됩니다. 서비스 계정은 W&B Team 설정에서 관리하세요.
PATCH /scim/Groups/{team_id}
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "remove",
"path": "members[value eq \"{user_id}\"]"
}
]
}
{
"displayName": "acme-devs",
"id": "ghi",
"members": [
{
"Value": "abc",
"Display": "dev-user1"
}
],
"meta": {
"resourceType": "Group",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:01:00Z",
"location": "Groups/ghi"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:Group"
]
}
팀에서 모든 사용자 제거하기
acme-devs에서 모든 사용자를 제거하려면:
이 작업은 사용자에게만 적용되며 서비스 계정에는 적용되지 않습니다. 서비스 계정은 W&B Team 설정에서 관리하세요.
PATCH /scim/Groups/{team_id}
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "remove",
"path": "members"
}
]
}
{
"displayName": "acme-devs",
"id": "ghi",
"members": null,
"meta": {
"resourceType": "Group",
"created": "2023-10-01T00:00:00Z",
"lastModified": "2023-10-01T00:01:00Z",
"location": "Groups/ghi"
},
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:Group"
]
}
- Teams에는 추가 데이터가 연결되어 있기 때문에 현재 SCIM API에서는 Teams 삭제를 지원하지 않습니다. 모든 관련 항목을 완전히 삭제하겠다는 것을 최종 확인하려면 앱에서 Teams를 삭제하세요.
SCIM 역할 리소스는 W&B의 커스텀 역할에 매핑됩니다. 앞에서 언급했듯이 /Roles 엔드포인트는 공식 SCIM 스키마의 일부가 아니며, W&B는 W&B 조직에서 커스텀 역할을 자동으로 관리할 수 있도록 /Roles 엔드포인트를 추가로 제공합니다.
역할의 고유 ID를 사용하여 커스텀 역할 정보를 조회합니다.
- URL:
<host-url>/scim/Roles/{id}
- 메서드: GET
{
"description": "A sample custom role for example",
"id": "Um9sZTo3",
"inheritedFrom": "member", // 사전 정의된 역할을 나타냄
"meta": {
"resourceType": "Role",
"created": "2023-11-20T23:10:14Z",
"lastModified": "2023-11-20T23:31:23Z",
"location": "Roles/Um9sZTo3"
},
"name": "Sample custom role",
"organizationID": "T3JnYW5pemF0aW9uOjE0ODQ1OA==",
"permissions": [
{
"name": "artifact:read",
"isInherited": true // 사전 정의된 member 역할에서 상속됨
},
...
...
{
"name": "project:update",
"isInherited": false // 관리자가 추가한 사용자 지정 권한
}
],
"schemas": [
""
]
}
W&B 조직에 정의된 모든 커스텀 역할 정보를 조회합니다.
- URL:
<host-url>/scim/Roles
- 메서드: GET
{
"Resources": [
{
"description": "예제용 커스텀 역할",
"id": "Um9sZTo3",
"inheritedFrom": "member", // 이 커스텀 역할이 상속하는 사전 정의 역할을 나타냅니다
"meta": {
"resourceType": "Role",
"created": "2023-11-20T23:10:14Z",
"lastModified": "2023-11-20T23:31:23Z",
"location": "Roles/Um9sZTo3"
},
"name": "샘플 커스텀 역할",
"organizationID": "T3JnYW5pemF0aW9uOjE0ODQ1OA==",
"permissions": [
{
"name": "artifact:read",
"isInherited": true // member 사전 정의 역할로부터 상속됨
},
...
...
{
"name": "project:update",
"isInherited": false // 관리자가 추가한 커스텀 권한
}
],
"schemas": [
""
]
},
{
"description": "또 다른 예제용 커스텀 역할",
"id": "Um9sZToxMg==",
"inheritedFrom": "viewer", // 이 커스텀 역할이 상속하는 사전 정의 역할을 나타냅니다
"meta": {
"resourceType": "Role",
"created": "2023-11-21T01:07:50Z",
"location": "Roles/Um9sZToxMg=="
},
"name": "샘플 커스텀 역할 2",
"organizationID": "T3JnYW5pemF0aW9uOjE0ODQ1OA==",
"permissions": [
{
"name": "launchagent:read",
"isInherited": true // viewer 사전 정의 역할로부터 상속됨
},
...
...
{
"name": "run:stop",
"isInherited": false // 관리자가 추가한 커스텀 권한
}
],
"schemas": [
""
]
}
],
"itemsPerPage": 9999,
"schemas": [
"urn:ietf:params:scim:api:messages:2.0:ListResponse"
],
"startIndex": 1,
"totalResults": 2
}
- Endpoint:
<host-url>/scim/Roles
- Method: POST
- Description: W&B 조직에 새 커스텀 역할을 생성합니다.
- Supported Fields:
| Field | Type | Required |
|---|
name | String | 커스텀 역할의 이름 |
description | String | 커스텀 역할의 설명 |
permissions | Object array | 각 객체에 w&bobject:operation 형태의 값을 갖는 name 문자열 필드가 포함된 권한 객체 배열입니다. 예를 들어, W&B run 삭제 작업에 대한 권한 객체의 name은 run:delete가 됩니다. |
inheritedFrom | String | 커스텀 역할이 상속할 사전 정의된 역할입니다. member 또는 viewer 중 하나일 수 있습니다. |
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Role"],
"name": "예시용 커스텀 역할",
"description": "예시용 커스텀 역할",
"permissions": [
{
"name": "project:update"
}
],
"inheritedFrom": "member"
}
{
"description": "예시용 커스텀 역할",
"id": "Um9sZTo3",
"inheritedFrom": "member", // 사전 정의된 역할을 나타냅니다
"meta": {
"resourceType": "Role",
"created": "2023-11-20T23:10:14Z",
"lastModified": "2023-11-20T23:31:23Z",
"location": "Roles/Um9sZTo3"
},
"name": "예시용 커스텀 역할",
"organizationID": "T3JnYW5pemF0aW9uOjE0ODQ1OA==",
"permissions": [
{
"name": "artifact:read",
"isInherited": true // member 사전 정의된 역할에서 상속됨
},
...
...
{
"name": "project:update",
"isInherited": false // 관리자가 추가한 커스텀 권한
}
],
"schemas": [
""
]
}
- Endpoint:
<host-url>/scim/Roles/{id}
- Method: PATCH
- Description: 기존 사용자 정의 역할에 권한을 추가합니다.
PATCH /scim/Roles/{role_id}
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "add",
"path": "permissions",
"value": [
{
"name": "project:delete"
},
{
"name": "run:stop"
}
]
}
]
}
새 권한이 추가된 업데이트된 역할을 반환합니다.
- Endpoint:
<host-url>/scim/Roles/{id}
- Method: PATCH
- Description: 기존 커스텀 역할에서 권한을 제거합니다.
PATCH /scim/Roles/{role_id}
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "remove",
"path": "permissions",
"value": [
{
"name": "project:update"
}
]
}
]
}
지정된 권한이 제거된 업데이트된 역할을 반환합니다.
- Endpoint:
<host-url>/scim/Roles/{id}
- Method: PUT
- Description: 커스텀 역할 정의 전체를 교체합니다.
PUT /scim/Roles/{role_id}
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Role"],
"name": "Updated custom role",
"description": "Updated description for the custom role",
"permissions": [
{
"name": "project:read"
},
{
"name": "run:read"
},
{
"name": "artifact:read"
}
],
"inheritedFrom": "viewer"
}
W&B 조직에서 커스텀 역할을 삭제합니다. 신중하게 사용하세요. 이 작업을 수행하면, 해당 커스텀 역할이 상속받았던 사전 정의된 역할이 이전에 그 커스텀 역할이 할당되어 있던 모든 사용자에게 대신 할당됩니다.
- URL:
<host-url>/scim/Roles/{id}
- 메서드: DELETE
SCIM API는 동시 수정으로 인한 충돌을 방지하기 위한 조건부 업데이트를 위해 ETag를 지원합니다. ETag는 ETag 응답 헤더와 meta.version 필드에 포함되어 반환됩니다.
ETag을 사용하려면:
- 현재 ETag 가져오기: 리소스를 GET 요청으로 가져올 때 응답의 ETag 헤더 값을 확인합니다
- 조건부 업데이트: 업데이트할 때
If-Match 헤더에 해당 ETag를 포함합니다
# 사용자를 가져오고 ETag를 기록합니다
GET /scim/Users/abc
# 응답에 포함: ETag: W/"xyz123"
# ETag로 업데이트합니다
PATCH /scim/Users/abc
If-Match: W/"xyz123"
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "organizationRole",
"value": "admin"
}
]
}
412 Precondition Failed 오류 응답은 리소스가 사용자가 조회한 이후에 수정되었음을 나타냅니다.
SCIM API는 표준 SCIM 오류 응답을 반환합니다.
| Status Code | Description |
|---|
200 | 성공 |
201 | 생성됨 |
204 | 콘텐츠 없음 (삭제 성공) |
400 | 잘못된 요청 - 유효하지 않은 매개변수 또는 요청 본문 |
401 | 인증되지 않음 - 인증 실패 |
403 | 접근 금지 - 권한 부족 |
404 | 찾을 수 없음 - 리소스가 존재하지 않음 |
409 | 충돌 - 리소스가 이미 존재함 |
412 | 전제 조건 실패 - ETag 불일치 |
500 | 내부 서버 오류 |
W&B는 두 가지 별도의 SCIM API 구현을 운영하며, 구현별로 지원하는 기능이 서로 다릅니다:
| 기능 | Dedicated Cloud | Self-Managed |
|---|
| 사용자 이메일 변경 | - | ✓ |
| 사용자 표시 이름 변경 | - | ✓ |
| 사용자 비활성화 | ✓ | ✓ |
| 사용자 재활성화 | - | ✓ |
| 한 사용자에 여러 이메일 주소 사용 | ✓ | - |
- 최대 결과 수: 요청당 최대 9,999개의 항목을 반환합니다.
- 단일 테넌트 환경: 사용자당 하나의 이메일 주소만 지원합니다.
- 팀 삭제: SCIM을 통해는 지원되지 않으며, W&B 웹 인터페이스를 사용해야 합니다.
- 사용자 재활성화: Multi-tenant Cloud 환경에서는 지원되지 않습니다.
- 시트 한도: 조직의 시트 한도에 도달하면 작업이 실패할 수 있습니다.