앞서 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 유효성을 유지시켜 줄 수 있습니다.
'GCP > Apps Script' 카테고리의 다른 글
Apps Script로 친구에게 카카오톡 메시지 보내기 #2 (3) | 2024.12.27 |
---|---|
Apps Script로 친구에게 카카오톡 메시지 보내기 #1 (4) | 2024.12.27 |
Apps Script와 ChatGPT로 WordPress에 쿠팡 어필리에이트 글 올리기 #3 (6) | 2024.10.08 |
Apps Script와 ChatGPT로 WordPress에 쿠팡 어필리에이트 글 올리기 #2 (2) | 2024.10.04 |
Apps Script와 ChatGPT로 WordPress에 쿠팡 어필리에이트 글 올리기 #1 (4) | 2024.10.02 |