ai-creator

[python] 인증키 관리 본문

오늘 배워 오늘 쓰는 OpenAPI/Quick Start

[python] 인증키 관리

ai-creator 2020. 5. 28. 20:40
반응형

<< 문제 정의 >>

프로그램을 작성할 때마다 앱키를 찾아서 복사하고, access_token이 만료되면 재발급소스 코드를 수행하는게 참 번거롭습니다.  


<< 목표 >>

OpenAPI를 제공하는 플랫폼들의 인증키를 관리하는 프로그램을 만들어봅시다.


<< 사전 준비 >>

- 구글 인증키 발급

- 카카오 인증키 발급

- 네이버 인증키 발급

- 공공데이터 포털 인증키 발급

<< 예제 파일 >>

인증키 관리.zip
0.00MB


<< 구현 순서 >>

Step 1 auth 모음집 만들기
Step 2 플랫폼의 인증 파일명 얻어오기
Step 3 인증키 읽기
Step 4 인증키 업데이트

Step1) auth 모음집 만들기

auth 라는 이름의 폴더를 만들고, 그 안에 4개의 파일을 만듭니다.

 

- 구글의 경우는 다운로드 받은 파일명을 google_code.json로 파일 이름을 변경합니다.

- kakao_code.json은 아래와 같이

{"app_key": "앱키를 입력하세요", 
"refresh_token": "refresh token을 입력하세요", 
"access_token": "access token을 입력하세요"}

- naver_code.json

{"client_id" : "client_id를 입력하세요",
"client_secret" : "client_secret을 입력하세요"}

- opendata_code.json

{"service_key" : "service_key를 입력하세요"}


Step2) 플랫폼의 인증 파일명 얻어오기

인증 파일명은 플랫폼 별로 규칙성이 있습니다.

000_code.json 이지요.

플랫폼명(회사명)을 input으로 받고, 인증 파일명을 output으로 주는 함수를 만들었습니다.

def _get_auth_filename(company):
    BASE_DIR = "auth"
    POSTFIX = "_code.json"
    
    filename = os.path.join(BASE_DIR, company+POSTFIX)
    
    return filename

 

Step3) 인증키 읽기

원하는 플랫폼의 인증키를 읽어서 output으로 주는 함수 입니다. 

def read_auth(company):
    #>> 파일명 얻기
    filename = _get_auth_filename(company)
    
    # >> 파일읽기
    with open(filename, "r") as fp:
        tokens = json.load(fp)
        
    if company == "google":
        tokens = filename
        
    # >> auth key return
    return tokens

 

Step4) 인증키 업데이트

카카오의 경우 특정 시간이 지나면 access_token이 무효화 됩니다. 이때 refresh token으로 재발급받아야 하죠.

재발급 받는 함수입니다.

단, 현재는 카카오 플랫폼만 지원이 되요. 만약, 네이버도 추가하지 싶다면, elif문을 추가하면 됩니다.

def _kakao_update_auth(tokens):
    url = "https://kauth.kakao.com/oauth/token"
    data = {
        "grant_type" : "refresh_token",
        "client_id" : tokens['app_key'],
        "refresh_token" : tokens['refresh_token']
    }

    response = requests.post(url, data=data)
    if response.status_code == 200:
        tokens['access_token'] = response.json()['access_token']
        tokens['expires_in'] = response.json()['expires_in']
    else:
        print("kakao_update_auth(%d) : error!!" %(response.status_code))
        #tokens['expires_in'] = 0
        
    return tokens


def update_auth(company, token):
    #>> update
    if company == "kakao":
        #print(">> before : "); print(token)
        retoken = _kakao_update_auth(token)
        #print(">> after : "); print(retoken)
    #elif company == "naver":
    #    retoken = naver_update_auth(token)
    else:
        return token
    
    #>> 파일 쓰기
    #>>>> 파일명 얻기
    filename = _get_auth_filename(company)
    #>>>> write
    with open(filename, "w") as fp:
        json.dump(retoken, fp)
        
        
    return retoken

 

 


저작물의 저작권은 작성자에게 있습니다.
공유는 자유롭게 하시되 댓글 남겨주세요~
상업적 용도로는 무단 사용을 금지합니다.
끝까지 읽어주셔서 감사합니다^^

 

반응형
Comments