Directory API로 구성원, 조직, 그룹 등 Admin에서 구성원 메뉴에 있는 구성원과 조직의 리소스를 조회하고 수정할 수 있다. Directory API로 접근할 수 있는 리소스는 다음과 같다.
users)groups)orgunits)levels)positions)user-types)custom-fields)user-custom-properties)profile-statuses)Directory API를 호출하려면 구성원 계정 또는 서비스 계정으로 인증하여 얻은 Access Token이 필요하다.
API scope는 다음과 같다.
directory: 모든 리소스에 접근 가능user: 구성원 리소스만 접근 가능group: 그룹 리소스만 접근 가능orgunit: 조직 리소스만 접근 가능API로 구성원, 그룹, 조직, 직급, 직책, 사용자 유형, 사용자 지정 필드 리소스에 접근할 때, 리소스 ID나 외부 키, 로그인 ID를 이용해 리소스를 지정하고 식별할 수 있다.
리소스 ID는 각 리소스를 추가할 때 시스템에서 지정되는 고유 ID이다. 리소스 ID에는 다음과 같은 특징이 있으므로 API로 리소스를 지정하고 식별하는 데 리소스 ID를 사용하는 것이 좋다.
외부 키(external key)는 NAVER WORKS의 각 리소스에 API 사용자 또는 관리자가 할당할 수 있는 임의의 값이다.
고객사의 사내 시스템 ID를 NAVER WORKS 리소스의 외부 키로 등록하면 NAVER WORKS에서 동일하게 사용할 수 있다
외부 키는 API를 사용해 등록하거나 Developer Console의 조직 연동에서 등록한다. API를 사용한 외부 키의 일괄 등록은 외부 키 수정 및 목록 조회를 참고한다.
외부 키를 사용해 리소스를 지정하는 경우 다음 형식으로 표시된다.
externalKey:ExternalKey 값리소스 유형에 따라 외부 키에 사용할 수 있는 문자와 값은 테넌트 혹은 도메인 내에서 유일해야 한다.
각 제한은 아래 표와 같다.
| 리소스 | 속성 | 문자 제한 | 제한 범위 |
|---|---|---|---|
구성원(users) | userExternalKey | % \ # / ?는 사용할 수 없다. | 테넌트 |
조직(orgunits) | orgUnitExternalKey | % \ # / ?는 사용할 수 없다. | 테넌트 |
그룹(groups) | groupExternalKey | % \ # / ?는 사용할 수 없다. | 테넌트 |
사용자 유형(user-types) | userTypeExternalKey | % # / ? 는 사용할 수 없다. | 테넌트 |
직책(position) | positionExternalKey | % # / ?는 사용할 수 없다. | 도메인 |
직급(levels) | levelExternalKey | % # / ?는 사용할 수 없다. | 도메인 |
사용자 지정 필드(custom-fields) | customFieldExternalKey | 영문과 숫자만 사용할 수 있다(단, 첫 번째 문자는 영문만 입력 가능). 대소문자를 구분하지 않는다. | 도메인 |
구성원의 외부 키는 로그인 시 ID로 지정할 수 있다.
NAVER WORKS의 구성원에 해당하는 리소스이다.
주의
API로 조회하거나 설정할 수 있는 속성은 NAVER WORKS Admin에 설정된 구성원 속성에 따라 달라진다.
참고
구성원은 awaiting(활성화 전), pending(대기 중), using(사용 중), suspended(일시정지), deleted(삭제) 6가지의 단계를 가진다. 각 단계는 구성원 목록 및 상세 정보 조회 API를 통해 확인할 수 있으며 상세 내용은 아래와 같다.
상태 Parameter Description awaiting isAwaiting activationDate 이전의 계정 상태.
이후 SSO 연동 여부에 따라 pending 또는 using 상태로 변경된다.pending isPending 미접속 상태.
관리자가 구성원을 추가한 후 첫로그인을 하지 않은 상태를 의미한다.using n/a 사용 중 상태. suspended isSuspended이 일시정지 상태.
로그인은 불가하나 구성원의 데이터는 삭제되지 않고 유지된다.deleted isDeleted 삭제 상태.
삭제 시점으로부터 7일 간 이 상태로 유지되다가 7일이 지난 시점 데이터가 삭제된다.
구성원을 추가하고 수정한다. 비밀번호는 구성원을 추가할 때만 설정할 수 있다.
| HTTP Request | Description |
|---|---|
| POST /users | 구성원 추가 |
| PUT /users/{userId} | 구성원 수정 |
| PATCH /users/{userId} | 구성원 부분 수정 |
도메인의 구성원 목록을 조회한다. 목록을 정렬하고 필터링할 수 있다.
| HTTP Request | Description |
|---|---|
| GET /users | 구성원 목록 조회 |
구성원 조회는 사용 방법에 따라 제한된 필드만 포함하는 응답을 얻을 수 있다.
다음의 세 가지 방법으로 구성원을 조회할 수 있다. 요청 구문은 동일하지만 Access Token 발급 시 지정한 scope에 따라 응답으로 반환되는 정보가 다르다.
| HTTP Request | Description |
|---|---|
| GET /users/{userId} | 구성원 조회. Scope: user.read / user구성원의 모든 정보가 반환된다. |
| GET /users/{userId} | 구성원 프로필 조회. Scope: user.profile.read구성원의 프로필 정보만 반환된다. 개인 이메일 주소( privateEmail)나 생년월일(birthday)등의 개인 정보는 포함되지 않는다. |
| GET /users/{userId} | 구성원 메일 주소 조회. Scope: user.email.read구성원 ID( userId)와 로그인 ID(email)만 반환된다. |
구성원 삭제는 일반 삭제와 즉시 삭제가 있다. 일반 삭제한 구성원은 삭제 후 7일 이내에 삭제를 취소할 수 있다. 삭제 후 7일이 지나거나 즉시 삭제한 구성원은 복구할 수 없다.
| HTTP Request | Description |
|---|---|
| DELETE /users/{userId} | 구성원 삭제 |
| DELETE /users/{userId}/forcedelete | 구성원 즉시 삭제 |
| POST /users/{userId}/undelete | 구성원 삭제 취소 |
구성원 사진은 다음 API로 관리한다.
| HTTP Request | Description |
|---|---|
| POST /users/{userId}/photo | 구성원 사진 업로드 |
| GET /users/{userId}/photo | 구성원 사진 조회 |
| DELETE /users/{userId}/photo | 구성원 사진 삭제 |
파일 업로드/다운로드 방법에 대한 자세한 내용은 파일 업로드/다운로드를 참고한다.
구성원의 상태는 다음 API로 관리한다. 도메인의 상태 관리는 상태(profile-statuses)를 참고한다.
구성원은 '현재 상태'와 '예약 상태'를 등록할 수 있다.
{ "userProfileStatuses": [ { "profileStatusId": "AWAY", "statusMessage": "외출 중입니다.", "startTime": "2023-05-11T09:00:00+09:00", "endTime": "2023-05-11T12:00:00+09:00", ... } ]}외부 NAVER WORKS 사용자 또는 LINE 사용자와의 대화 권한을 관리할 수 있다.
다음 API로 외부 NAVER WORKS 사용자와의 대화 권한을 관리한다.
| HTTP Request | Description |
|---|---|
| POST /users/link-to-works | 도메인의 외부 NAVER WORKS 연동 권한 부여 |
| POST /users/{userId}/link-to-works | 구성원의 외부 NAVER WORKS 연동 권한 부여 |
| POST /users/{userId}/unlink-to-works | 구성원의 외부 NAVER WORKS 연동 권한 삭제 |
다음 API로 외부 LINE 사용자와의 대화 권한을 관리한다.
| HTTP Request | Description |
|---|---|
| POST /users/link-to-line | 도메인의 외부 LINE 연동 권한 부여 |
| POST /users/{userId}/link-to-line | 구성원의 외부 LINE 연동 권한 부여 |
| POST /users/{userId}/unlink-to-line | 구성원의 외부 LINE 연동 권한 삭제 |
다음 API로 구성원의 외부 대화 상대 추가 URL을 관리한다.
| HTTP Request | Description |
|---|---|
| GET /users/{userId}/link-url | 구성원 외부 대화 상대 추가 URL 조회 |
| POST /users/{userId}/link-url/reset | 구성원 외부 대화 상대 추가 URL 초기화 |
주의
userscope가 필요하다.directoryscope로는 외부 연동 권한을 관리할 수 없다.
구성원이 휴직할 경우 '휴직' 또는 '일시 정지'로 설정할 수 있다. 휴직으로 설정된 구성원은 프로필과 조직도에 휴직 정보가 표시된다. 또, API로 조회한 구성원 정보에 leaveOfAbsence로 표시된다. 일시 정지된 구성원은 NAVER WORKS에 로그인할 수 없으며, API로 조회한 구성원 정보에 isSuspended로 표시된다.
| HTTP Request | Description |
|---|---|
| POST /users/{userId}/suspend | 구성원 일시 정지 |
| POST /users/{userId}/unsuspend | 구성원 일시 정지 취소 |
| POST /users/{userId}/set-leave-of-absence | 구성원 휴직 설정 |
| POST /users/{userId}/clear-leave-of-absence | 구성원 휴직 해제 |
다음 API로 구성원을 초대하거나 강제로 로그아웃시킬 수 있다.
| HTTP Request | Description |
|---|---|
| POST /users/{userId}/send-invitation-email | 구성원 초대 메일 재발송 |
| POST /users/send-invitation-email | 구성원 초대 이메일 일괄 재발송 |
| POST /users/{userId}/force-logout | 구성원 강제 로그아웃 |
프로젝트나 사내 모임 활동과 같은 커뮤니케이션을 위한 그룹(groups)을 만들 수 있다. 그룹은 다음 API로 관리한다.
| HTTP Request | Description |
|---|---|
| POST /groups | 그룹 추가 |
| GET /groups | 그룹 목록 조회 |
| GET /groups/{groupId} | 그룹 조회 |
| PUT /groups/{groupId} | 그룹 수정 |
| PATCH /groups/{groupId} | 그룹의 부분 수정 |
| DELETE /groups/{groupId} | 그룹 삭제 |
| GET /groups/{groupId}/administrators | 그룹 관리자 목록 조회 |
| POST /groups/{groupId}/administrators | 그룹 관리자 추가 |
| DELETE /groups/{groupId}/administrators/{userId} | 그룹 관리자 삭제 |
| GET /groups/{groupId}/members | 그룹 구성원 목록 조회 |
| POST /groups/{groupId}/members | 그룹 구성원 추가 |
| DELETE /groups/{groupId}/members/{id} | 그룹 구성원 삭제 |
그룹에서는 메시지, 노트, 캘린더, 할 일, 폴더 등의 기능을 활용할 수 있다. 그룹은 도메인 단위로 관리한다. 그룹을 관리할 그룹 마스터를 한 명 이상 지정해야 하며, 구성원, 조직 또는 다른 그룹을 그룹에 추가할 수 있다.
{ "groupName": "검증", "administrators": [ { "userId": "user-40d6-450f-1c78-1234567890ab", "userExternalKey": null }, { "userId": "user-08ee-41fb-1a61-1234567890ab", "userExternalKey": null } ], "members": [ { "id": "user-40d6-450f-1c78-1234567890ab", "type": "USER", "externalKey": null }, { "id": "orgunit-5c41-4baf-239e-1234567890ab", "type": "ORGUNIT", "externalKey": null }, { "id": "group-6bb3-40ea-37a7-1234567890ab", "type": "GROUP", "externalKey": null } ],...}동적 그룹을 사용하면 조건(쿼리)을 작성하여 그룹 구성원을 특정한 규칙에 따라 자동으로 관리할 수 있다. 해당 조건과 일치하는 구성원이 자동으로 그룹 구성원에 추가되거나 삭제된다.
동적 그룹의 쿼리 작성법은 다음과 같다.
쿼리 작성 시 사용할 수 있는 속성은 다음과 같다.
| User Attribute | Description | Example |
|---|---|---|
| user.userTypeId | 구성원 사용자 유형 ID 규칙 지정 | user.userTypeId == 'usertypei-70c3-46a8-22dd-03ef7c571975' |
| user.levelId | 구성원 직급 ID 규칙 지정 | user.levelId == 'levelid8e-70c3-46a8-22dd-03ef7c571975' |
| user.location | 구성원 근무처 규칙 지정 | user.location == 'Office' |
| user.task | 구성원 담당 업무 규칙 지정 | user.task == 'Planing' |
| user.organizations.exists(organization, organization.domainId={domainId}) | 구성원의 소속 회사 규칙 지정 | user.organizations.exists(organization, organization.domainId == 123) |
| user.organizations.exists(organization, organization.domainId={domainId} && organization.primary=true) | 구성원의 소속 회사 및 원직 여부 규칙 지정 | user.organizations.exists(organization, organization.domainId == 123 && organization.primary==true) |
| user.organizations.orgUnits.exists(orgUnit, orgUnit.orgUnitId == '{orgUnitId}') | 구성원의 직속 조직 규칙 지정 | user.organizations.orgUnits.exists(orgUnit, orgUnit.orgUnitId == 'orgunit8e-70c3-46a8-22dd-03ef7c571975') |
| user.organizations.orgUnits.exists(orgUnit, orgUnit.isManager == true) | 구성원의 직속 조직에서의 조직장 규칙 지정 | user.organizations.orgUnits.exists(orgUnit, orgUnit.orgUnitId == 'orgunit8e-70c3-46a8-22dd-03ef7c571975' && orgUnit.isManager == true) |
| user.organizations.orgUnits.exists(orgUnit, orgUnit.positionId == '{positionId}') | 구성원의 직책 규칙 지정 | user.organizations.orgUnits.exists(orgUnit, orgUnit.positionId == 'positione-70c3-46a8-22dd-03ef7c571975') |
| user.organizations.orgUnits.exists(orgUnit, orgUnit.orgUnitId == '{orgUnitId}' && orgUnit.positionId == '{positionId}') | 구성원의 직속 조직 및 해당 조직에서의 직책 규칙 지정 | user.organizations.orgUnits.exists(orgUnit, orgUnit.orgUnitId == 'orgunit8e-70c3-46a8-22dd-03ef7c571975' && orgUnit.positionId == 'positione-70c3-46a8-22dd-03ef7c571975') |
| Function Name | Description | Example |
|---|---|---|
| isMemberOfOrgUnit | 조직 ID를 입력받는다. 조직 ID에 해당하는 조직과 그 조직의 모든 하위 조직 구성원을 그룹 구성원으로 추가한다. | user.isMemberOfOrgUnit('orgunit8e-70c3-46a8-22dd-03ef7c571975') |
| isMemberOfGroup | 그룹 ID를 입력받는다. 그룹 ID에 해당하는 그룹의 구성원을 그룹 구성원으로 추가한다. | user.isMemberOfGroup('groupit8e-70c3-46a8-22dd-03ef7c571975') |
조건문을 괄호(( ))로 감싸고, 앞에 느낌표(!)를 추가한다.
| User Attribute | Negative Support | Example |
|---|---|---|
| user.userTypeId | Y | !(user.userTypeId == 'usertypei-70c3-46a8-22dd-03ef7c571975') |
| user.levelId | Y | !(user.levelId == 'levelid8e-70c3-46a8-22dd-03ef7c571975') |
| user.location | Y | !(user.location == 'Office') |
| user.task | Y | !(user.task == 'Planing') |
| user.organizations.exists(organization, organization.domainId={domainId}) | N | N/A |
| user.organizations.exists(organization, organization.domainId={domainId} && organization.primary=true) | N | N/A |
| user.organizations.orgUnits.exists(orgUnit, orgUnit.orgUnitId == '{orgUnitId}') | Y | !(user.organizations.orgUnits.exists(orgUnit, orgUnit.orgUnitId == 'orgunit8e-70c3-46a8-22dd-03ef7c571975')) |
| user.organizations.orgUnits.exists(orgUnit, orgUnit.isManager == true) | Y | !(user.organizations.orgUnits.exists(orgUnit, orgUnit.orgUnitId == 'orgunit8e-70c3-46a8-22dd-03ef7c571975' && orgUnit.isManager == true) |
| user.organizations.orgUnits.exists(orgUnit, orgUnit.positionId == '{positionId}') | Y | !(user.organizations.orgUnits.exists(orgUnit, orgUnit.positionId == 'positione-70c3-46a8-22dd-03ef7c571975')) |
| user.organizations.orgUnits.exists(orgUnit, orgUnit.orgUnitId == '{orgUnitId}' && orgUnit.positionId == '{positionId}') | Y | !(user.organizations.orgUnits.exists(orgUnit, orgUnit.orgUnitId == 'orgunit8e-70c3-46a8-22dd-03ef7c571975' && orgUnit.positionId == 'positione-70c3-46a8-22dd-03ef7c571975')) |
| Function Name | Negative Support | Example |
|---|---|---|
| isMemberOfOrgUnit | Y | !(user.isMemberOfOrgUnit('orgunit8e-70c3-46a8-22dd-03ef7c571975')) |
| isMemberOfGroup | Y | !(user.isMemberOfGroup('groupit8e-70c3-46a8-22dd-03ef7c571975')) |
조건은 쿼리의 최소 단위이다. 다음과 같은 형태로 입력한다.
{속성} {속성과 값 사이의 연산자} {값} 예시) user.userTypeId == 'usertypei-70c3-46a8-22dd-03ef7c571975'
다음은 조건과 조건 사이에 사용할 수 있는 논리 연산자이다.
다음은 속성과 값 사이에 사용할 수 있는 연산자이다.
연산 시 조건의 우선순위는 다음과 같다.
예시)
A || B && C: B && C 조건부터 처리함.(A || B) && C: 괄호로 묶인 A || B 조건부터 처리함.A || B || C: 우선순위가 동일하므로 왼쪽 조건인 A || B부터 처리함.다음과 같은 제한 사항이 적용된다.
회사의 조직 정보에 따라 NAVER WORKS에 조직(orgunits)을 등록할 수 있다. 프로젝트나 사내 모임 등은 조직이 아닌 그룹을 이용한다. 조직은 다음 API로 관리한다.
| HTTP Request | Description |
|---|---|
| POST /orgunits | 조직 추가 |
| GET /orgunits | 조직 목록 조회 |
| GET /orgunits/{orgUnitId} | 조직 조회 |
| PUT /orgunits/{orgUnitId} | 조직 수정 |
| PATCH /orgunits/{orgUnitId} | 조직의 부분 수정 |
| DELETE /orgunits/{orgUnitId} | 조직 삭제 |
| POST /orgunits/{orgUnitId}/move | 조직 이동 |
| GET /orgunits/{orgUnitId}/members | 조직 구성원 목록 조회 |
조직은 메시지, 노트, 캘린더, 할 일, 폴더 등의 기능을 활용할 수 있다. 조직은 도메인 단위로 관리한다. 구성원이 속한 조직은 조직 목록(orgUnits)에서 확인하고 구성할 수 있다.
{ "email": "user@example.com", "organizations": [ { ... "orgUnits": [ { "orgUnitId": "orgunit-0faa-4f37-22bb-1234567890ab", "orgUnitName": "영업부", ... } ] } ], ...조직도에서 조회 제한 설정을 할 수 있다.
구성원 조회 제한은 다음 API로 설정한다.
| HTTP Request | Description |
|---|---|
| POST /orgunits/{orgUnitId}/orgunit-access-restrict | 구성원 조회 제한 설정 |
| GET /orgunits/{orgUnitId}/orgunit-access-restrict | 구성원 조회 제한 조회 |
| PUT /orgunits/{orgUnitId}/orgunit-access-restrict | 구성원 조회 제한 수정 |
| DELETE /orgunits/{orgUnitId}/orgunit-access-restrict | 구성원 조회 제한 삭제 |
사용자 유형 조회 제한은 다음 API로 설정한다.
| HTTP Request | Description |
|---|---|
| POST /directory/user-types/{userTypeId}/orgunit-access-restrict | 사용자 유형 조회 제한 설정 |
| GET /directory/user-types/{userTypeId}/orgunit-access-restrict | 사용자 유형 조회 제한 조회 |
| PUT /directory/user-types/{userTypeId}/orgunit-access-restrict | 사용자 유형 조회 제한 수정 |
| DELETE /directory/user-types/{userTypeId}/orgunit-access-restrict | 사용자 유형 조회 제한 삭제 |
조직 조회 제한은 다음 API로 설정한다.
| HTTP Request | Description |
|---|---|
| POST /orgunits/{orgUnitId}/orgunit-access-restrict | 조직 조회 제한 설정 |
| GET /orgunits/{orgUnitId}/orgunit-access-restrict | 조직 조회 제한 조회 |
| PUT /orgunits/{orgUnitId}/orgunit-access-restrict | 조직 조회 제한 수정 |
| DELETE /orgunits/{orgUnitId}/orgunit-access-restrict | 조직 조회 제한 삭제 |
조회 제한은 '구성원', '사용자 유형', '조직' 순으로 적용된다.
예를 들어, 특정 구성원의 조회 제한이 구성원과 사용자 유형, 조직에 설정되어 있으면 우선순위에 따라 구성원에 설정된 조회 제한이 적용되며, 조회 제한 타입에 따라 자신만 조회하거나, 소속된 조직, 또는 소속된 조직과 선택한 조직만 조회할 수 있다.
직급(levels)은 구성원에게 부여되는 대리, 과장과 같은 직무 등급이다. 직급은 다음 API로 관리한다.
| HTTP Request | Description |
|---|---|
| POST /directory/levels/enable | 직급 사용 ON |
| POST /directory/levels/disable | 직급 사용 OFF |
| POST /directory/levels | 직급 추가 |
| GET /directory/levels | 직급 목록 조회 |
| GET /directory/levels/{levelId} | 직급 조회 |
| PUT /directory/levels/{levelId} | 직급 수정 |
| PATCH /directory/levels/{levelId} | 직급 부분 수정 |
| DELETE /directory/levels/{levelId} | 직급 삭제 |
직급은 도메인 단위로 관리한다. 구성원의 직급은 자동으로 부여되는 ID(levelId)로 지정하고 조회할 수 있다.
{ "email": "user@example.com", "organizations": [ { "domainId": 12345678, "organizationName": "샘플 상점", "levelId": "level-1999-4212-7979-1234567890ab", "levelName": "임원"...직책(positions)은 사용자에게 부여된 직무상 책임의 단위이다. 직책은 다음 API로 관리한다.
| HTTP Request | Description |
|---|---|
| POST /directory/positions/enable | 직책 사용 ON |
| POST /directory/positions/disable | 직책 사용 OFF |
| POST /directory/positions | 직책 추가 |
| GET /directory/positions | 직책 목록 조회 |
| GET /directory/positions/{positionId} | 직위 조회 |
| PUT /directory/positions/{positionId} | 직위 수정 |
| PATCH /directory/positions/{positionId} | 직책 부분 수정 |
| DELETE /directory/positions/{positionId} | 직책 삭제 |
직책은 도메인 단위로 관리한다. 구성원은 여러 개의 조직(orgUnits)에 소속될 수 있으므로 조직마다 다른 직책(positions)을 할당할 수 있다.
{ "email": "user@example.com", "organizations": [ { ... "orgUnits": [ { "orgUnitId": "orgunit-0faa-4f37-22bb-1234567890ab", "orgUnitName": "영업부", "primary": false, "positionId": null, ... }, { "orgUnitId": "orgunitc-1d15-4cdf-246b-1234567890ab", "orgUnitName": "영업 일과", "primary": true, "positionId": "position-821e-41af-8142-1234567890ab", "positionName": "과장", ... } ] } ], ...}사용자 유형(user-types)은 서비스 이용, 조직도의 열람 제한, 드라이브와 게시판에서의 공유 제한 등의 차등 권한 부여 시 사용하는 관리 구성원의 속성이다. 사용자 유형은 다음 API로 관리한다.
| HTTP Request | Description |
|---|---|
| POST /directory/user-types/enable | 사용자 유형 사용 ON |
| POST /directory/user-types/disable | 사용자 유형 사용 OFF |
| POST /directory/user-types | 사용자 유형 추가 |
| GET /directory/user-types | 사용자 유형 목록 조회 |
| GET /directory/user-types/{userTypeId} | 사용자 유형 조회 |
| PUT /directory/user-types/{userTypeId} | 사용자 유형 수정 |
| PATCH /directory/user-types/{userTypeId} | 사용자 유형 부분 수정 |
| DELETE /directory/user-types/{userTypeId} | 사용자 유형 삭제 |
사용자 유형은 도메인 단위로 관리한다. 구성원의 사용자 유형은 자동으로 부여되는 ID(userTypeId)로 지정하고 조회할 수 있다.
{ "email": "user@example.com", "userTypeId": "employmenttype-75b9-48dd-917a-1234567890ab", "userTypeName": "계약직"사용자 지정 필드(custom-fields)는 구성원에게 추가로 할당할 수 있는 링크 등의 필드이다. 다음 API로 관리할 수 있다.
| HTTP Request | Description |
|---|---|
| POST /directory/custom-fields | 사용자 지정 필드 정의 추가 |
| GET /directory/custom-fields | 사용자 지정 필드 정의 목록 조회 |
| GET /directory/custom-fields/{customFieldId} | 사용자 지정 필드 정의 조회 |
| PATCH /directory/custom-fields/{customFieldId} | 사용자 지정 필드 정의 수정 |
| DELETE /directory/custom-fields/{customFieldId} | 사용자 지정 필드 정의 삭제 |
사용자 지정 필드는 도메인당 최대 5개까지 등록할 수 있다. 구성원은 도메인에 등록된 사용자 지정 필드를 사용하여 최대 100개의 값을 입력할 수 있다.
{ "email": "user@example.com", "customFields": [ { "customFieldId": "customfield-36fe-4b1a-af0e-1234567890ab", "value": "일하는 문화를 바꿉니다", "link": null, "customFieldExternalKey": "CustomFldProject" }, { "customFieldId": "customfield-36fe-4b1a-af0e-1234567890ab", "value": "건강이 최고", "link": null, "customFieldExternalKey": "CustomFldProject" } ], ...}주의
사용자 지정 필드는 구성원 커스텀 속성(user-custom-properties)으로 전환하는 것을 권장한다. 사용자 지정 필드를 사용하면 구성원 커스텀 속성(user-custom-properties)에서만 제공되는 일부 신규 기능을 조회하거나 수정할 수 없다.
- 사용자 지정 필드는 구성원 커스텀 속성으로 자동으로 마이그레이션된다.
- customFieldExternalKey → fieldName(customFieldExternalKey 값이 없으면 fieldName은 자동 생성)
- customFieldId → customPropertyId
- customFieldName → displayName
- 사용자 지정 필드에 존재하지 않던 파라미터들은 구성원 커스텀 속성에서 기본값으로 생성된다.
- multiValued: true
- mandatory: false
- readAccessType: ALL
- writeAccessType: ADMIN
구성원 커스텀 속성(user-custom-properties)은 기본 제공 속성 외에 구성원에게 추가로 정의할 수 있는 속성이다. 다음 API로 관리할 수 있다.
| HTTP Request | Description |
|---|---|
| POST /directory/users/custom-properties | 구성원 커스텀 속성 추가 |
| GET /directory/users/custom-properties | 구성원 커스텀 속성 목록 조회 |
| GET /directory/users/custom-properties/{customPropertyId} | 구성원 커스텀 속성 조회 |
| PATCH /directory/users/custom-properties/{customPropertyId} | 구성원 커스텀 속성 수정 |
| DELETE /directory/users/custom-properties/{customPropertyId} | 구성원 커스텀 속성 삭제 |
구성원 커스텀 속성은 도메인당 최대 50개까지 등록할 수 있다. 커스텀 속성이 multiValued이면 해당 속성에는 최대 10개의 값을 입력할 수 있다. 커스텀 속성의 종류로는 텍스트, 링크, 숫자, 날짜가 있으며, 텍스트의 경우 옵션 목록(options)도 설정할 수 있다. 속성별로 필수 여부, 읽기 및 수정 권한을 설정할 수 있다. 속성별로 단일값, 다중값 여부를 설정할 수 있다.
구성원의 커스텀 속성은 구성원(users) API의 customProperties 필드를 이용해 설정하거나 조회할 수 있다.
{ "email": "user@example.com", "customProperties": { "field_string": "string", "field_string_multiValued": [ "string" ], "field_string_option": "optionName1", "field_string_multiValued_option": [ "optionName1" ], "field_date": "YYYY-MM-DD", "field_date_multiValued": [ "YYYY-MM-DD" ], "field_integer": 123, "field_integer_multiValued": [ 123 ], "field_link": { "text": "string", "link": "string" }, "field_link_multiValued": [ { "text": "string", "link": "string" } ] }, ...}주의
- 구성원 커스텀 속성(user-custom-properties)으로 신규 속성을 생성한 경우:
- 구성원(users)의 customFields에서는 multiValued=true이면서 propertyType이 STRING 또는 LINK인 경우에만 해당 속성을 설정할 수 있다. 단, propertyType이 STRING이어도 options의 값이 존재하면 해당 속성을 사용할 수 없다.
- 구성원(users)의 customFields와 customProperties를 동시에 입력하면 customProperties의 값이 우선 적용된다.
상태를 설정하면 조직도, 프로필, 메시지방 멤버 목록에 상태에 따라 아이콘이 표시된다. 상태는 다음 API로 관리할 수 있다.
상태는 도메인 단위로 관리한다. 기본값으로 설정된 BUSY, AWAY, LEAVE_OFFICE, ABSENCE는 변경하거나 삭제할 수 없다. 사용자 상태는 기본값을 포함하여 최대 10개까지 등록할 수 있다.
자세한 내용은 구성원 상태 관리를 참고한다.
다음 API로 외부 키를 수정하거나 목록을 조회할 수 있다.
| HTTP Request | Description |
|---|---|
| POST /users/external-keys | 구성원 외부 키 목록 수정 |
| GET /users/external-keys | 구성원 외부 키 목록 조회 |
| POST /groups/external-keys | 그룹 외부 키 목록 수정 |
| GET /groups/external-keys | 그룹 외부 키 목록 조회 |
| POST /orgunits/external-keys | 조직 외부 키 목록 수정 |
| GET /orgunits/external-keys | 조직 외부 키 목록 조회 |
| POST /directory/levels/external-keys | 직급 외부 키 목록 수정 |
| GET /directory/levels/external-keys | 직급 외부 키 목록 가져오기 |
| POST /directory/positions/external-keys | 직책 외부 키 목록 수정 |
| GET /directory/positions/external-keys | 직책 외부 키 목록 조회 |
| POST /directory/user-types/external-keys | 사용자 유형 외부 키 목록 수정 |
| GET /directory/user-types/external-keys | 사용자 유형 외부 키 목록 조회 |
조직 연동이란 고객사의 조직 정보를 NAVER WORKS의 조직 정보와 동기화하는 작업을 의미한다. Directory API를 이용하면 고객사의 조직 정보를 NAVER WORKS의 조직 정보와 동기화할 수 있다.
조직 연동을 사용하려면 아래와 같은 준비가 필요하다.
Developer Console의 조직연동 메뉴에서 다음과 같은 설정을 할 수 있다.
연동하고자 하는 항목(조직/구성원, 직급/직책, 그룹, 사용자 유형, 사용언어, 상태연동)을 On으로 설정할 수 있다. 구성원의 회사 겸직을 설정하려면 겸직 도메인도 조직 연동 사용 설정을 On으로 설정해야 한다. 조직 연동 설정 시 서비스에서 다음과 같은 기능이 제한된다.
조직, 구성원, 그룹, 사용자 유형, 직급, 직책, 상태를 구성하는 각각의 항목은 다음과 같은 방법으로 식별하거나 접근할 수 있다.
Directory API는 리소스 ID 또는 외부 키 매핑을 사용해 접근할 수 있다.
항목별로 전체 정보를 다운로드해 수정한 후 다시 등록하여 매핑할 수 있다.
조직도 팝업, 메일 주소록, 개인 정보 팝업에서 지정된 URL에 해당하는 화면을 표시한다. 팝업으로 표시할 경우 구성원 이름을 #SEARCHTEXT #파라미터에 포함하여 제공한다.
참고
Custom URL은 조직 연동 및 API 설정과 관계없이 설정할 수 있다.
조직 연동 사용 준비를 마쳤으면, Directory API를 사용할 수 있다.

[그림 1 조직 연동 배치]