GCP/Apps Script

Apps Script로 카카오톡 토큰 자동 Refresh하기

whistory 2024. 12. 27. 14:59
반응형

 

 

 

앞서 getKakaoAuth() 함수를 이용해 액세스 토큰을 발급 받을때 expires_in 이라는 항목이 있었습니다. 해당 항목은 액세스 토큰의 만료 시간(초)으로 21,599초 즉 5시간 59분 59초 후 액세스 토큰이 만료됨을 의미합니다.

 

만료된 토큰으로 메시지를 보내는 API를 실행해보겠습니다.

 

아래와 같은 토큰만료 오류 메시지가 발생하면서 메시지가 정상적으로 전송되지 않습니다.

 

 

{"msg":"this access token is already expired","code":-401}

 

 

앞서 발급받은 REFRESH_TOKEN을 이용해 ACCESS_TOKEN을 갱신하여 ACCESS_TOKEN의 유효성을 유지합니다.

 

 

/**
 * 카카오 Token 갱신하기
 * Reference : https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#refresh-token-info
 */
function getKakaoAuthRefresh() {
   // 스프레드 시트에서 Refresh Token 가져오기
   const ss = SpreadsheetApp.getActive();
   const REFRESH_TOKEN = ss.getRangeByName("REFRESH_TOKEN").getValue();
   // 카카오 토큰 생성 API URL
   const url = "https://kauth.kakao.com/oauth/token";
   // ➊ 요청 본문
   data = {
      "grant_type"   : "refresh_token",
      "client_id"    : CLIENT_ID,
      "redirect_uri" : "https://www.google.com",
      "refresh_token": REFRESH_TOKEN
   }
   // URL을 호출을 위한 환경설정
   const options = {
      method: "POST",
      contentType: "application/x-www-form-urlencoded;charset=utf-8",
      headers: { 
         Authorization: "Bearer " + CLIENT_ID 
      },
      payload: data
   };
   // URL을 환경설정 값과 함께 호출
   const response = UrlFetchApp.fetch(url, options).getContentText();
   const returndData = JSON.parse(response);
   console.log(returndData);
   const now = getDateTime();
   // ➋ 생성된 Access Token 을 스프레드 시트에 저장
   ss.getRangeByName("ACCESS_TOKEN").setValue(returndData.access_token);
   ss.getRangeByName("UPDATE_TIME").setValue(now);
   // ➌ 생성된 Refresh Token 을 스프레드 시트에 저장
   if ( returndData.refresh_token !== undefined ) {
      ss.getRangeByName("REFRESH_TOKEN").setValue(returndData.refresh_token);
   }
}

 

➊ 요청 본문의 "grant_type" 을 인증코드가 아닌 refresh_token을 이용해 인증을 진행하기 때문에 “authorization_code”가 아닌 "refresh_token" 로 변경해줍니다. 

 

➋ 갱신된 access_token과 현재 실행된 시간을 스프레드 시트에 입력합니다. 

 

➌ 오류를 방지하기 위해 결과값에 refresh_token이 있는 경우에만 스프레드 시트에 REFRESH_TOKEN을 입력하도록 처리합니다.  

 

 

예를들어 2023년12월19일 09:00에 토큰을 갱신한 경우

토큰만료일이 한달 넘게 남은 2024년1년18일 08:59 에 호출할 경우 결과값에 refresh_token을 반환하지 않습니다.

{ access_token: 'yY_Sz0i2pAFY1IrUPTzyqzTvAFL5Z2fQH-AKPXTaAAABjRTO5ljDukuslKNZWg',
  token_type: 'bearer',
  expires_in: 21599 }

 

 

토큰만료일이 한달 남은 2024년1년18일 09:00에 호출할 경우에는 refresh_token을 반환합니다.

 { access_token: 'gFVZnXcp-gMIQxOyEfkuS43JiSR_yhwXNFIKPXVcAAABjRn1N0_DukuslKNZWg',
  token_type: 'bearer',
  refresh_token: 'llfVkVmx2qDSNf9vkQbuAjZv-2hpA9giJVIKPXVcAAABjRn1N0rDukuslKNZWg',
  expires_in: 21599,
  refresh_token_expires_in: 5183999 }

 

 

 

코드를 저장한 다음 getKakaoAuthRefresh( ) 함수를 실행하면 토큰 갱신 결과값을 카카오톡 토큰을 관리하는 시트에 업데이트 합니다.

 

 

 

 

이제 getKakaoAuthRefresh() 함수를 6시간 단위 트리거로 생성해주면 카카오톡의 ACCESS_TOKEN을 지속적으로 갱신하여 자동으로 ACCESS_TOKEN 유효성을 유지시켜 줄 수 있습니다.

 

반응형