Microsoft 365(이하 M365)의 회의실 리소스를 예약하기 위해서는 예전에는 구내(On-Premises) Exchange와 동일하게 EWS(Exchange Web Services)를 쓸 수밖에 없었지만, 지금은 Graph API를 이용하여 예약할 수 있는데, 이 Graph API 역시 구글 API와 마찬가지로 사용자 계정으로 명시적으로 로그인 절차를 거친 뒤 받은 토큰을 기반으로 호출하여 사용하는 것이 가장 기본적인 동작이다. 그런데, 백그라운드 서비스나 일괄처리 작업 같은 경우에는 명시적인 사용자 로그인 과정을 거쳐서 토큰을 받아올 방법이 없다. 응? 그럼 어떻게...???

 

ㅎㅎ

그건 조금 뒤에 알아보기로 한다.

 

 

 

먼저, EWS를 사용하는 방법.

 

역시 M365에도 서비스 계정이라는 개념이 있다...?

아니, 그런 개념은 없다! 다만 일반 사용자 계정에 응용프로그램 가장(Application Impersonation)이라는 특수한 권한을 부여하면 서비스 계정인 것처럼 회의실 대리 예약 등의 동작이 가능한 것뿐.

 

이 절차를 간략하게 설명하면 아래와 같다.

 

  1. 사용자 계정을 새로 하나 만든다(예: ServiceAccount). 이 계정에는 굳이 M365 라이선스를 부여할 필요는 없다. 라이선스가 없어도 인증은 되며 EWS 호출 및 대리 예약에는 지장이 없다.
  2. 권한 위임(대리) 사용 범위를 제한하려면 아래 Powershell 명령을 실행하면 된다.

    PS> New-ManagementScope -Name "User Impersonation" -RecipientRestrictionFilter "RecipientType -eq 'UserMailbox'"
  3. Exchange 관리 센터(클래식)에서 사용 권한 - 관리자 역할 - "+" (추가)를 눌러 "ApplicationImpersonation" 사용 권한을 생성하고 앞에서 만든 사용자 계정 및 사용 범위(옵션)를 설정한다. (반드시 클래식 관리 센터에서 해야 한다. 새 관리 센터에는 이 기능이 없다.)

 

이 과정은 아래 참고 사이트에서도 확인할 수 있다.

 

>> 참고: https://ebstalimited.zendesk.com/hc/en-us/articles/360001118553-How-to-create-an-Office-365-service-account-

 

 

 

 

다음으로, Graph API를 사용하는 방법.

 

이 방법은 위 서비스 계정을 만들 필요가 없다. 대신, Azure 포털에서 앱을 등록하고 API 사용 권한을 설정한 다음 tenant_id, client_id, client_secret를 발급받아 회의실 일정 연동(동기화) 서비스 등에서 사용하면 된다.

  1. 앱 추가
    1. Azure AD 사이트(https://aad.portal.azure.com/)에 접속해서 "Azure Active Directory"를 선택한다.
    2. "앱 등록"을 선택하고 "+ 새 등록"을 클릭한다.
    3. 애플리케이션 이름을 입력하고 "등록" 버튼을 클릭하여 애플리케이션을 새로 생성한다.
  2. API 사용 권한 설정
    1. 해당 애플리케이션 화면에서 왼쪽 메뉴의 "API 사용 권한"을 선택한다.
    2. "+ 권한 추가"를 클릭하고 필요한 권한을 추가한다. (여기서는 예제로 캘린더 읽기/쓰기 및 사용자 속성 읽기 권한을 추가한다.)
      • Microsoft Graph API - Calendar 검색 - Calendars.ReadWrite 선택
      • Microsoft Graph API - User 검색 - User.Read.All 선택
    3. "[조직]에 대한 관리자 동의 허용"을 클릭한다.
  3. 클라이언트 암호 생성
    1. 왼쪽 메뉴에서 "인증서 및 암호"를 선택한다.
    2. "클라이언트 비밀" 아래의 "+ 새 클라이언트 암호"를 클릭하고 적당한 이름을 입력한다. (최대 사용기간은 2년이다. 2년이 되기 전에 새로 발급해서 교체해야 한다...)
    3. 추가된 클라이언트 암호 값을 따로 복사해 둔다(나중에도 확인 가능).
    4. 다시 왼쪽 메뉴의 "개요"를 선택하고 애플리케이션(클라이언트) ID 및 디렉터리(테넌트) ID를 복사해 둔다.

 

이상 복사해 둔 애플리케이션(클라이언트) ID(client_id), 디렉터리(테넌트) ID(tenant_id), 클라이언트 암호(client_secret) 값들을 사용해서 Graph API를 호출하면 백그라운드 서비스로 사용자 상호작용 없이 원하는 기능을 마음껏 사용할 수 있다.

 

끝.

 

 



Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]