Django의 Google API OAuth

구글 로그인으로 인증 시스템을 만드는 것은 비교적 간단한 작업입니다. Firebase 인증을 사용하여 쉽게 수행할 수 있습니다. 그러나 문제는 Google 캘린더, Gmail, 드라이브 등과 같은 사용자의 Google API에 액세스해야 할 때 발생합니다. 주요 문제는 사용자 토큰을 가져와 저장하는 것입니다. 따라서 사용자가 액세스 권한을 부여하고 계속해서 인증을 요청하지 않으면 애플리케이션이 사용자의 Google API에 액세스할 수 있습니다.

따라서 Google OAuth를 Django 애플리케이션과 통합하고 사용자 토큰을 검색, 저장하는 방법은 다음과 같습니다. google-api-python-client 를 통해 Google API에 대한 인증된 요청을 생성하는 데 사용할 수 있습니다.

목적



이 기사에서는 Google OAuth를 Django 애플리케이션과 통합하고 나중에 사용할 수 있도록 사용자 토큰을 저장하고 저장된 자격 증명을 사용하여 사용자의 Google 캘린더에서 다가오는 이벤트에 액세스하는 방법을 보여 드리겠습니다.

전제 조건



Google API Console 에서 이미 프로젝트를 만들고 프로젝트에 대해 Google Calendar API를 활성화했으며 OAuth 동의 화면을 설정했으며 client_id.json 파일이 있다고 가정하겠습니다.

또한 이미 django 애플리케이션을 초기화했다고 가정합니다.

시작하자



먼저 oauth를 설정하기 위해 google-apis-oauth-django를 설치하고 다음 명령어로 구글 API에 접근하기 위해 google-api-python-client를 설치해야 합니다.

pip install google-apis-oauth-django google-api-python-client


먼저 사용자를 Sign In With Google 라는 URL로 리디렉션하는 google_oauth/redirect/ 버튼을 만듭니다. 먼저 사용자를 리디렉션하기 위한 보기를 만들어야 합니다. views.py에 다음 코드를 추가하십시오.

import os
import google_apis_oauth

from django.shortcuts import HttpResponseRedirect

# The url where the google oauth should redirect
# after a successful login.
REDIRECT_URI = 'http://localhost:8000/google_oauth/callback/'

# Authorization scopes required
SCOPES = ['https://www.googleapis.com/auth/calendar']

# Path of the "client_id.json" file
JSON_FILEPATH = os.path.join(os.getcwd(), 'client_id.json')

def RedirectOauthView(request):
    oauth_url = google_apis_oauth.get_authorization_url(
        JSON_FILEPATH, SCOPES, REDIRECT_URI)
    return HttpResponseRedirect(oauth_url)


이제 urls.py 에서 다음과 같이 하여 이 보기를 포함할 수 있습니다.

urlpatterns = [
    ...,
    path('google_oauth/redirect/', RedirectOauthView)
]


이제 사용자가 해당 Sign In With Google 버튼을 클릭하면 Google oauth 화면으로 리디렉션됩니다. 로그인에 성공하면 위에서 지정한 REDIRECT_URIgoogle_oauth/callback/ 로 리디렉션됩니다.

따라서 이에 대한 견해도 작성해야 합니다. 해당 보기에서 이제 사용자 자격 증명을 성공적으로 검색할 수 있습니다.

def CallbackView(request):
    try:
        # Get user credentials
        credentials = google_apis_oauth.get_crendentials_from_callback(
            request,
            JSON_FILEPATH,
            SCOPES,
            REDIRECT_URI
        )

        # Stringify credentials for storing them in the DB
        stringified_token = google_apis_oauth.stringify_credentials(
            credentials)

        # Store the credentials safely in the DB
        ...

        # Now that you have stored the user credentials you
        # can redirect user to your main application.
        ...
    except exceptions.InvalidLoginException:
        # This exception is raised when there is an inavlid
        # request to this callback uri.

urls.py 에 이 보기를 추가합니다.

urlpatterns = [
    ...,
    path('google_oauth/callback/', CallbackView)
]


이제 사용자의 자격 증명이 있습니다. 다음 방법으로 Google API에 액세스할 수 있습니다.

import google_apis_oauth
from googleapiclient.discovery import build

# Load the stored credentials in a variable say 'stringigied_token'

# Load the credentials object using the stringified token.
creds = google_apis_oauth.load_credentials(stringified_token)

# Using credentials to access Upcoming Events
service = build('calendar', 'v3', credentials=creds)
now = datetime.datetime.utcnow().isoformat() + 'Z'
print('Getting the upcoming 10 events')
events_result = service.events().list(
    calendarId='primary', timeMin=now,
    maxResults=10, singleEvents=True,
    orderBy='startTime').execute()
events = events_result.get('items', [])

if not events:
    print('No upcoming events found.')
for event in events:
    start = event['start'].get('dateTime', event['start'].get('date'))
    print(start, event['summary'])


그게 다야! 마찬가지로 이 자격 증명을 사용하여 다른 Google API에도 액세스할 수 있습니다.

좋은 웹페이지 즐겨찾기