System for Cross-domain Identity Management(SCIM) API를 사용하면 인스턴스 또는 조직 관리자가 W&B 조직의 사용자, 그룹, 커스텀 역할을 관리할 수 있습니다. SCIM 그룹은 W&B 팀에 매핑됩니다.
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 key를 사용해 전송하는 SCIM API 요청이 올바른 조직에 영향을 미칩니다. 프로필 이미지를 클릭한 다음 User Settings를 클릭하고, Default API organization 설정을 확인합니다.선택한 호스팅 옵션에 따라 이 페이지의 예시에서 사용하는 <host-url> 플레이스홀더 값이 결정됩니다.또한 예시에서는 abc, def 같은 사용자 ID를 사용합니다. 실제 요청과 응답에서는 사용자 ID가 해시된 값으로 표시됩니다.
주요 차이점을 먼저 확인한 다음, 사용자 아이덴티티 또는 서비스 계정 중 어떤 방식으로 인증할지 선택하십시오.
- 사용 대상: User는 상호작용형의 단발성 관리자 작업에 적합하고, service account는 자동화 및 통합(CI/CD, 프로비저닝 도구)에 적합합니다.
- 자격 증명: User는 사용자 이름과 API key를 전송하고, service account는 API key만 전송합니다(사용자 이름 없음).
- Authorization 헤더 페이로드: User는
username:API-KEY를 인코딩하고, service account는 :API-KEY(선행 콜론 포함)를 인코딩합니다.
- 범위와 권한: 둘 다 관리자 권한이 필요합니다. service account는 조직 범위이며 headless로 동작하여, 자동화를 위한 감사 로그를 더 명확하게 제공합니다.
- 자격 증명 위치: User는 User Settings에서 자신의 API key를 복사하고, service account key는 조직의 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)> 형식으로 설정합니다(앞에 오는 콜론과 비어 있는 사용자 이름에 유의). 서비스 계정 API key는 조직 대시보드의 Service account 탭에서 찾을 수 있습니다. 조직 범위 서비스 계정을 참고하세요.
예를 들어, API key sa-p@55w0rd로 인증하려면 다음을 실행합니다:
Authorization: Basic OnNhLXBANTV3MHJk
SCIM 사용자 리소스는 W&B 사용자와 매핑됩니다. 조직의 사용자를 관리하려면 이 엔드포인트를 사용하세요.
조직 내 특정 사용자에 대한 정보를 조회합니다.
- URL:
<host-url>/scim/Users/{id}
- 메서드: GET
| 매개변수 | 유형 | 필수 여부 | 설명 |
|---|
id | string | Yes | 사용자의 고유 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의 어떤 페이지든 열거나, 실행을 기록(log)하거나, SDK를 사용하거나, 어떤 방식으로든 W&B 서버와 상호 작용하는 경우 활성으로 간주됩니다.
- Multi-tenant Cloud: 사용자가 2025년 5월 8일 이후 조직 범위의 감사(audit) 가능한 작업을 수행한 경우 활성으로 간주됩니다. 전체 목록은 감사 로깅 작업을 참고하세요.
조직의 모든 사용자 목록을 조회합니다.
이 작업에서는 서비스 계정이 포함되지 않습니다.
/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
{
"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의 어떤 페이지든 열거나, 실행을 로깅하거나, SDK를 사용하거나, 어떤 방식으로든 W&B 서버와 상호작용하면 활성으로 간주됩니다.
- 멀티테넌트 Cloud: 사용자가 2025년 5월 8일 이후에 조직 범위에서 감사 로그로 기록되는 작업을 수행한 경우 활성으로 간주됩니다. 전체 목록은 감사 로그 작업을 참조하세요.
조직에 새 사용자를 추가합니다.
- URL:
<host-url>/scim/Users
- 메서드: POST
| Parameter | Type | Required | Description |
|---|
emails | array | Yes | 이메일 객체 배열입니다. 기본(primary) 이메일을 포함해야 합니다. |
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에서 사용자를 프로비저닝 해제(deprovision)하는 경우, 프로비저닝 해제 작업으로 인해 인스턴스 또는 조직에서 마지막으로 남은 관리자가 실수로 제거될 수 있습니다.운영 절차 수립을 위한 지원이 필요하거나 관리자 액세스를 복구해야 하는 경우 support로 문의하세요.
조직에서 사용자를 완전히 삭제합니다.
이 작업은 사용자 계정에만 적용되며 서비스 계정에는 적용되지 않습니다. 서비스 계정은 W&B Team 설정에서 삭제하세요.
- URL:
<host-url>/scim/Users/{id}
- 메서드: DELETE
| 매개변수 | 형식 | 필수 여부 | 설명 |
|---|
id | string | 예 | 삭제할 사용자의 고유 ID |
사용자를 일시적으로 비활성화하려면 PATCH 엔드포인트를 사용하는 사용자 비활성화 API를 참고하세요.
사용자의 기본 이메일 주소를 변경합니다.
사용자 계정을 조직에서 관리하지 않는 환경인 멀티 테넌트 클라우드(Multi-tenant Cloud) 에서는 지원되지 않습니다.
- URL:
<host-url>/scim/Users/{id}
- 메서드: 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}
- 메서드: PATCH
| 매개변수 | 타입 | 필수 | 설명 |
|---|
id | string | Yes | 사용자의 고유 ID |
op | string | Yes | replace |
path | string | Yes | displayName |
value | string | Yes | 새 표시 이름 |
표시 이름 업데이트 요청
표시 이름 업데이트 응답
{
"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}
- 메서드: PATCH
| 매개변수 | 타입 | 필수 여부 | 설명 |
|---|
id | string | Yes | 비활성화할 사용자의 고유 ID |
op | string | Yes | replace |
value | object | Yes | {"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 팀 설정에서 관리하세요.
-
멀티 테넌트 클라우드에서는 사용자 재활성화가 지원되지 않습니다. 사용자의 액세스를 복원하려면 사용자를 조직에 다시 추가해야 합니다. 사용자 생성을 참조하세요. 멀티 테넌트 클라우드에서는 사용자의 계정이 조직에서 관리되지 않습니다. 사용자를 재활성화하려는 경우 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}
- 메서드: 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 역할이 할당됩니다.
- Models에서는
full 시트 대신 viewer 시트가 할당됩니다. 이에 따라 Models에는 보기 전용 액세스 권한이, Registry에는 전체 액세스 권한이 부여됩니다. 사용 가능한 Models 시트가 없으면 Seat limit reached 오류가 기록되고, 해당 멤버는 Models 액세스 없이 추가됩니다. 시트가 나중에 사용 가능해지면 이후에 업데이트할 수 있습니다.
- Weave에서는
full 시트 대신 viewer 시트가 할당됩니다. 이에 따라 Weave에는 보기 전용 액세스 권한이 부여됩니다. 사용 가능한 Weave 시트가 없으면 Seat limit reached 오류가 기록되고, 해당 멤버는 Weave 액세스 없이 추가됩니다. 시트가 나중에 사용 가능해지면 이후에 업데이트할 수 있습니다.
- 조직 수준에서 표시되는 Registry에는 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}
- 메서드: 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}
- 메서드: PATCH
| 매개변수 | 타입 | 필수 여부 | 설명 |
|---|
id | string | 예 | 사용자의 고유 ID |
op | string | 예 | add |
path | string | 예 | registryRoles |
value | array | 예 | registryName 및 roleName을 포함하는 객체 배열 |
{
"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"
}
사용자를 레지스트리에서 제거합니다.
- 제거 작업은 RFC 7644 SCIM 프로토콜 사양을 따릅니다. 특정 레지스트리에서 사용자를 제거하려면
"registryRoles[registryName eq \"{registry_name}\"]" 필터 구문을 사용하고, 모든 레지스트리에서 사용자를 제거하려면 "registryRoles" 필터를 사용하세요.
- 이 작업은 사용자에게만 적용되며, 서비스 계정에는 적용되지 않습니다. 서비스 계정을 레지스트리에서 제거하려면 W&B 팀 설정에서 수행하세요.
- URL:
<host-url>/scim/Users/{id}
- Method: PATCH
| 매개변수 | 유형 | 필수 여부 | 설명 |
|---|
id | string | Yes | 사용자의 고유 ID |
op | string | Yes | remove |
path | string | Yes | "registryRoles[registryName eq \"{registry_name}\"]" 또는 "registryRoles" |
레지스트리에서 제거 요청
레지스트리에서 제거 응답
{
"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"
}
모든 레지스트리에서 제거 요청
모든 레지스트리에서 제거 응답
{
"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 팀으로 생성되어 매핑되며, 이후 SCIM 그룹에 대한 다른 작업은 모두 이 팀을 대상으로 수행됩니다.
SCIM을 사용해 W&B 팀을 생성하면 조직 수준 서비스 계정이 모두 자동으로 팀에 추가되어, 해당 서비스 계정이 팀 리소스에 계속 액세스할 수 있습니다.
/Groups 엔드포인트는 특정 팀을 검색하기 위한 필터링을 지원합니다.
displayName eq "value" - 팀 표시 이름으로 필터링합니다.
GET /scim/Groups?filter=displayName eq "engineering-team"
팀의 고유 ID를 제공하여 팀 정보를 조회합니다.
- URL:
<host-url>/scim/Groups/{id}
- 메서드: 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"
]
}
팀 목록을 조회합니다.
- 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 | 예 |
members | 다중 값 배열 | 예 (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 멤버, remove 멤버, replace 멤버들
-
remove 연산은 RFC 7644 SCIM 프로토콜 사양을 따릅니다. 특정 사용자를 제거하려면 필터 구문 members[value eq "{user_id}"]를 사용하고, 팀에서 모든 사용자를 제거하려면 members를 사용하세요.
사용자 식별: 멤버 연산에서 {user_id}는 다음 중 하나일 수 있습니다:
-
이러한 연산은 서비스 계정이 아닌 사용자에게만 적용됩니다. 팀의 서비스 계정을 업데이트하려면 W&B 팀 설정에서 변경하세요.
요청에서 {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 팀 설정에서 관리하십시오.
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"
]
}
- 팀에는 추가 데이터가 연결되어 있기 때문에 현재 SCIM API에서는 팀 삭제를 지원하지 않습니다. 모든 관련 항목을 삭제하려는 것이 맞다면 앱에서 팀을 삭제하십시오.
SCIM Role 리소스는 W&B 사용자 정의 역할에 매핑됩니다. 앞에서 언급했듯이 /Roles 엔드포인트는 공식 SCIM 스키마의 일부가 아니며, W&B 조직에서 사용자 정의 역할을 자동으로 관리할 수 있도록 W&B에서 /Roles 엔드포인트를 제공합니다.
역할의 고유 ID를 제공하여 해당 사용자 지정 역할 정보를 조회합니다.
- URL:
<host-url>/scim/Roles/{id}
- 메서드: GET
{
"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": [
""
]
}
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 실행에 대한 삭제 작업 권한 객체의 name 값은 run:delete가 됩니다. |
inheritedFrom | String | 사용자 정의 역할이 상속받을 사전 정의된 역할입니다. member 또는 viewer 중 하나일 수 있습니다. |
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Role"],
"name": "Sample custom role",
"description": "A sample custom role for example",
"permissions": [
{
"name": "project:update"
}
],
"inheritedFrom": "member"
}
{
"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": [
""
]
}
- 엔드포인트:
<host-url>/scim/Roles/{id}
- 메서드: PATCH
- 설명: 기존 사용자 정의 역할에 권한을 추가합니다.
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}
- Method: DELETE
SCIM API는 동시 수정 충돌을 방지하기 위해 조건부 업데이트에 ETag를 지원합니다. ETag는 ETag 응답 헤더와 meta.version 필드에 포함되어 반환됩니다.
ETags를 사용하려면:
- 현재 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개 항목.
- Single-tenant 환경: 사용자당 하나의 이메일 주소만 지원합니다.
- 팀 삭제: SCIM을 통해 팀 삭제는 지원되지 않습니다(W&B 웹 인터페이스를 사용하세요).
- 사용자 재활성화: Multi-tenant Cloud 환경에서는 지원되지 않습니다.
- 시트 한도: 조직의 시트 한도에 도달하면 작업이 실패할 수 있습니다.