연구실 대시보드에 구글 캘린더를 연동하여 구성원들의 일정을 확인한다.

구현목표

  • 연구실 구성원들의 일정을 파악하기 위한 기능을 구현하고자 한다.
    1. 우선적으로 slack을 통해 재적 상태를 확인한다.
    2. 현재 재적중이지 않은 구성원의 경우 고정적인 스케줄을 적어둔 연구실 일정표(구글 시트)
      3. 현재 재적중이지 않은 구성원의 경우 연구실 캘린더(구글 캘린더)를 참고하도록 한다. (현재 진행중)

문제상황

토큰의 유효기간이 하루여서 매일 로그인하여 인증해야하는 문제가 발생하였다.
따라서 이를 해결하고자 chatGPT에게 해결방법을 물어보았다.

chatGPT - 질문

구글 캘린더에서 이벤트들을 불러오는 코드를 짜고 있는데, 토큰이 하루만에 만료되는 거 같아.
코드를 통해서 토큰을 불러올 수 있는데 그러면 로그인을 해야해. 서버에 올려둘예정인데 해결방법이 있을까

chatGPT - 답변

구글 캘린더 API에서 토큰이 하루 만에 만료되는 문제를 해결하려면 OAuth 2.0의 리프레시 토큰을 활용하는 것이 좋습니다. 리프레시 토큰 활용: 리프레시 토큰은 접근 토큰이 만료되었을 때 자동으로 새로운 접근 토큰을 요청하는 데 사용됩니다. 초기 인증 시 offline 모드를 설정해 리프레시 토큰을 받습니다. 이 토큰은 만료되지 않으므로, 사용자가 다시 로그인할 필요 없이 자동 갱신이 가능합니다. 자동 갱신 코드 추가: 매번 요청 전에 접근 토큰의 유효성을 확인하고, 만료되었을 경우 리프레시 토큰을 통해 자동으로 갱신하도록 설정합니다.

from google.oauth2.credentials import Credentials
from google.auth.transport.requests import Request

creds = Credentials(token='YOUR_ACCESS_TOKEN',
                   refresh_token='YOUR_REFRESH_TOKEN',
                   token_uri='https://oauth2.googleapis.com/token',
                   client_id='YOUR_CLIENT_ID',
                   client_secret='YOUR_CLIENT_SECRET')
if creds.expired and creds.refresh_token:
   creds.refresh(Request())

보안 유지: 리프레시 토큰과 클라이언트 비밀키를 안전하게 저장합니다. 서버 환경에서는 환경 변수나 비밀 관리 도구를 사용하는 것이 좋습니다. 이렇게 설정하면 사용자 로그인 없이 서버에서 자동으로 토큰을 갱신하면서 구글 캘린더 데이터를 가져올 수 있습니다.`

핵심코드&해결과정

  1. 인증코드 받기
    ` https://accounts.google.com/o/oauth2/auth? client_id=YOUR_CLIENT_ID& redirect_uri=YOUR_REDIRECT_URI& scope=https://www.googleapis.com/auth/calendar &response_type=code&access_type=offline`

위의 링크에 맞는 id, uri를 입력하여 code를 얻는다.

  1. 인증코드로 토큰 교환하기 ```python import requests

url = ‘https://oauth2.googleapis.com/token’

data = { ‘code’: ‘AUTH_CODE_FROM_PREVIOUS_STEP’, ‘client_id’: ‘YOUR_CLIENT_ID’, ‘client_secret’: ‘YOUR_CLIENT_SECRET’, ‘redirect_uri’: ‘YOUR_REDIRECT_URI’, ‘grant_type’: ‘authorization_code’ }

response = requests.post(url, data=data) ``` 1번 단계로 얻은 코드 등을 활용하여 refresh_code를 얻는다.

참고사항

redirect_uri를 바꾸어서 다시 시도했더니 성공했다.
시도한 redirect_url : http://localhost:63710/flowName=GeneralOAuthFlow

처음 시도한 uri와 다시 시도한 uri의 차이점은 모르겠다.
다만 credentials.json에 저장된 redirect_uri와 일치하는 것을 확인했다.

credentials.json 파일은 처음 구글 캘린더의 일정을 불러오기 위해 사용한 것으로 추정된다.