Data/Python

[Google Developers] API 사용방법 2 - API , OAuth 2.0 동의화면

뚱요 2022. 12. 9. 09:19
반응형

구글 제품들을 이용하면서 사용자의 데이터를 접근할 수 있도록 API를 제공하고 있습니다. 구글 제품에 연동해서 데이터를 실시간으로 가져와 사용할 수 있습니다.
이번에는 API를 사용하기 위해 기본 환경설정 및 간단한 프로젝트를 소개할 예정입니다.

과정

  • 환경 설정
  • 클라이언트 라이브러리 설치
  • 프로그래밍 실행

요구사항

1. 환경설정

1.1 Google Cloud Project 생성

먼저 Google Developer 가입 후 Google Cloud 프로젝트 생성해야 Google Workspace API를 사용, Google Workspace 부가기능, API 관리, 결제 사용 설정, 공동작업자 추가 및 삭제, 권한 관리를 포함한 모든 Google Cloud 서비스를 생성, 사용 설정, 사용할 수 있습니다.

  1. Google Cloud 프로젝트 생성 >새 프로젝트
  2. 프로젝트 이름 설정 , 위치 선택, 만들기 하면 프로젝트 생성 완료
 

1.2 API 사용 설정하기

한 프로젝트에 여러 개 API 사용 가능하여 하단의 과정을 반복해서 API 사용설정하면 됩니다.

  1. Google Cloud 콘솔 메뉴 menu > API 및 서비스 > 라이브러리
  2. 라이브러리에서 원하는 API 검색해서 원하는 서비스를 선택.
  3. 사용 설정을 클릭하면 자동으로 화면이 API 및 서비스 > 사용 설정된 API 및 서비스로 전환

1.3 OAuth 동의 화면 구성

사용자가 데이터에 대한 앱의 액세스 권한을 이해하고 승인할 수 있도록 합니다.

OAuth2.0 프로토콜
어떤 서비스에 저장된 자신의 데이터를 다른 서비스에서 접근할 수 있도록 승인해주는 프로토콜로 많은 글로벌 기업들이 채택하면서 OAuth는 인가 분야에서 거의 산업 표준이 되어 가고 있습니다.
승인에 OAuth 2.0을 사용하면 앱에서 계정의 여러 액세스 범위에 대한 승인을 요청하고 사용자에게 프로젝트 및 정책 요약과 요청된 액세스 범위가 포함된 동의 화면을 표시합니다. 사용자 데이터 접근 여부를 특정 데이터를 특정 작업에만 사용하도록 사용자가 접근 허용을 할 수 있습니다.
인증 및 승인 작동 방식
OAuth 동의 범위: 범위는 사용자를 대신해 액세스 권한을 요청할 사용자 데이터 종류를 정의합니다. 참조:  사용 가능한 범위의 전체 목록.
민감한 API 범위:  동의 화면에서 사용자에게 표시되기 전에 Google이 인증을 요청합니다.
제한된 API 범위: 앱에서 제한된 범위를 사용하는 경우 Google에서 앱이 특정 API 범위의 추가 요구사항준수하는지 확인합니다. 참조 : 현재의 제한된 범위 목록

1. Google Cloud console에서 menu > API 및 서비스 (APIs & Services) > OAuth 동의 화면

2. 용도에 맞추어 사용자 선택 , 만들기 클릭

 
User Type 내부 외부
정의 조직내 사용자(G Suite 그룹 내) Google 계정이 있는 모든 테스트 사용자
-  테스트 사용자 목록에 추가된 사용자
인증 앱을 제출할 필요 없음 프로덕션 및 앱 게시 시 인증
앱 등록 프로세스 필요한 정보

  • 앱 이름, 사용자 지원 이메일, 로고(선택사항)
  • 개발자 연락처 이메일
  • 사용자 유형 및 게시 상태 등 앱 구성 방식
  • 앱 이름, 사용자 지원 이메일, 로고(선택사항)
  • 앱 홈페이지, 개인정보처리방침, 서비스 약관(선택사항)
  • 범위를 통해 액세스할 사용자 데이터 유형
  • 개발자 연락처 이메일
 
 
 

1.4 사용자 인증정보 만들기 : OAuth 클라이언트 ID 생성

필요한 사용자 인증 정보는 앱의 데이터 유형, 플랫폼 및 액세스 방법에 따라 상이합니다.
최종 유저 인증하고 유저 데이터에 접근하기 위해서 1개 이상의 OAuth 2.0 Client 아이디를 생성해야 합니다.

각 플랫폼 개수만큼 클라이언트 ID를 생성해야
합니다. 클라이언트 ID는 Google's OAuth 서버에서 각 애플리케이션을 구분하는 데에 사용합니다

사용자 인증정보 유형 3가지

  • API 키 : 앱에서 공개적으로 사용 가능한 데이터에 익명으로 액세스
  • OAuth 클라이언트 ID : 최종 사용자로 인증하고 데이터에 액세스, 앱에서 사용자의 동의를 요청하고 받아야 합니다.
  • 서비스 계정 : 로봇 서비스 계정으로 인증/Google Workspace 또는 Cloud ID 사용자를 대신하여 도메인 전체 위임을 통해 리소스에 액세스
  1. API 및 서비스 > 사용자 인증정보 만들기
  2. + 사용자 인증정보 만들기 > OAuth 클라이언트 ID (OAuth 2.0 Client IDs) 클릭

3. 애플리케이션 유형 선택, 이름 설정

4. 생성하면 생성 화면에서 Client ID와 Client secret 비밀번호가 나온다. 1회만 나오므로 복사해서 붙여 넣기 하거나 json으로 다운로드

2. 구글 클라이언트 라이브러리 설치

파이썬에서 Google client library 설치하기 (최초 1회)

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

3. 설정 및 실행

환경설정을 모든 언어에 동일, 프로그래밍 언어는 파이썬
OAuth 클라이언트에서 발급한 ID, 비밀번호가 담긴 json 파일명칭을 credential.json으로 변경해서 working directory에 저장하기
  1. 처음 실행 시 access 권한 확인을 합다. token.json 에 유저의 접근과 리프레쉬 토큰이 저장되어 있습다. 첫 인증이 성공적인 경우에 생성되면서 인증 정보가 파일 시스템에 저장되어 다음 실행 시에 바로 호출 가능합니다
  2. 첫 실행에는 토큰이 없기 때문에 구글에 로그인하라고 요청받습니다. 이미 여러 계정에 로그인되었다면 인증을 위해서 계정 하나 선택해서 Accpet 합니다.
  3. 목적에 따라서 API 호출합니다.
from __future__ import print_function

import os.path

from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

# If modifying these scopes, delete the file token.json.
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']


def main():
    """Shows basic usage of the Gmail API.
    Lists the user's Gmail labels.
    """
    creds = None
    # The file token.json stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', SCOPES)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    try:
        # Call the Gmail API
        service = build('gmail', 'v1', credentials=creds)
        results = service.users().labels().list(userId='me').execute()
        labels = results.get('labels', [])

        if not labels:
            print('No labels found.')
            return
        print('Labels:')
        for label in labels:
            print(label['name'])

    except HttpError as error:
        # TODO(developer) - Handle errors from gmail API.
        print(f'An error occurred: {error}')


if __name__ == '__main__':
    main()


이번에 정리하면서 OAuth 2.0 프로토콜 인증 프로세스와 인증 정보에 대해서 좀 더 이해하게 되었습니다.
제가 한 프로젝트는 특정 기준으로 필터링하고 HTML 형태의 내용에서 특정 태그를 기준으로 가져오고  자연어 처리하여 수집했습니다.
참고로 기본 100개 호출하니 호출 가능한 max 값 별도 설정 해주셔야 합니다.



출처:

반응형