본문 바로가기
Programming/Java_Spring

MS OAuth를 통한 Calendar정보 연동하기.

by 곰네Zip 2022. 12. 7.

MS OAuth로그인을 하고, 해당 로그인 정보를 이용하여 Outlook에 등록한 일정 정보를 얻어올 수 있다.

찾느라 한동안 삽질했었어서... 까먹지 말자고 기록하기 위해 남김.

 

1. MS OAuth로그인 할 때, 권한 설정해주기.

  MS OAuth로그인을 하는건 좋은데, 해당앱을 통해 로그인 하면 어디까지 권한을 받을 수 있을까? 그냥 냅두면 얻을 수 있는 권한은 없다. (당연하지..)

 '앱등록' - '내가선택한앱' - 'API 사용권한'을 들어가자.

권한 추가를 누르면 아래와 같이 팝업이 발생한다.

 

  나는 메일 읽고, 캘린더 연동할 것이므로.. Graph를 선택하고, 권한은 '위임된 권한'을 선택한다.

 그러면 권한 목록이 주루룩~ 나온다.

  Calendar는 Calendars 그룹에 가서 선택해주면 된다. 나의 경우 내 앱에서 Calendar정보를 읽기만 할 것이므로.. Calendars.Read 만 체크.

 그 외에 원하는 권한을 체크한 후, '권한추가'를 눌러서 추가하면 된다.

  그러면 할당된 권한 목록이 아래와 같이 표시된다.

 여기서 'API/권한 이름'을 잘 기억할 것.

 우리가 MSAL라이브러리를 이용하여, OAuth요청을 생성할 때, scope에 저 값들이 들어가야한다.

 OAuth로그인 사용자 이메일 주소를 얻고싶으면 scope에 email이, Calendar를 읽어오려면 Calendars.Read 가 포함되면 된다. 

 

2. 인증 호출 전 설정하기 
 나의 경우 authenrication.properties에 scope등을 등록해두었다. 그래서 거기에 값을 수정함.

 *뱀발 :  authority에서 나의 경우 테넌트ID자리에 'common'을 넣어두었다. 어느 사용자든지 다 들어올 수 있어야해서.. 그래서 common으로 ID를 지정해 주었음.

 

 oauth2.aad.scopes = ... Calendars.Read ... << 이런식으로 기입해주고 OAuth로그인을 하면, 해당 인증 정보를 가지고 캘린더 정보를 읽어올 수 있다.

 

3. 인증호출 (생략) 후, 캘린더 정보 읽어오기.

내가 작성한 코드는 아래와 같다.

public void myFunc(){
	try{
    	CalendarGetScheduleParameterSet params = new CalendarGetScheduleParameterSet();
        DateTimeTimeZone startDate = new DateTimeTimeZone();
        startDate.dateTime= "2022-11-01T00:00:00";
        startDate.timeZone = "Korea Standard Time";
        params.startTime = startDate;
        params.endTime = endDate; //검색 종료일자
        params.schdules = loginUserList; //calendar가져올 Email ID
		GraphServiceClient gsClient =  GraphServiceClient.builder()
    												.authenticationProvider(new MsalGraphAuthenticationProvider(userInfo))
                                                    .buildClient();
        CalendarGetScheduleCollectionPage calendars = gsClient.me()
        													  .calendar()
                                                              .getSchedule(params)   
                                                              .buildRequest()
                                                              .post();
       List<ScheduleInformation> scheduleLists = calendar.getCurrentPage();
       scheduleLists.forEach(scheduleInfo -> {
       		scheduleInfo.scheduleItems.forEach( schedulItem-> {
            	blabla;
        	});
       });
    }catch(Exceptions... ){
    	//Exception들 처리할 것.
    }
}

위와 같이 사용하면 된다.

반응형

댓글