Firebase cloud functionからGoogle calender APIを叩こうと思ったらめっちゃ大変だったので、参考文献含め備忘録。
#OAuth認証について
OAuth認証については以下に詳しく書いてある。
https://developers.google.com/identity/protocols/oauth2?csw=1
Qiitaではこちらの記事が非常にわかりやすく、参考になった。
一番分かりやすい OAuth の説明
#GoogleのAPIにおけるPythonでの様々な認証方法
以下の記事が非常に詳しい。参考にさせていただいた。
PythonプログラムでGoogle認証してGoogleのサービスを利用する
#サーバーサイドから認証するには
ここで少し触れている
以下は冒頭の日本語訳
以前のサインインの追加 手順では、アプリはクライアント側でのみユーザーを認証します。その場合、ユーザーがアプリをアクティブに使用している間のみ、GoogleAPIにアクセスできます。サーバーがユーザーに代わって(おそらくオフラインのときに)Google API呼び出しを行えるようにする場合、サーバーにはアクセストークンが必要です。
また、以下にも方法について記述がある
https://zenn.dev/d_forest/articles/f78078f33a7f2748d5d9
つまり、
ユーザーはアプリケーションサイドでGoogleアカウントにログインし、auth_codeを生成して、サーバーへ渡す。サーバーは、受け取ったauth_codeからaccess_tokenとrefresh_tokenを生成して、ユーザーの代わりに認証を行う。
一旦はこれの動作が確認できるように、ローカルで動くように実装した。
#実装
ほぼこの記事の通りで行けた
https://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.html
import datetime
from google_auth_oauthlib.flow import Flow
flow = Flow.from_client_secrets_file(
'credential.json',
scopes=['https://www.googleapis.com/auth/calendar.readonly'],
redirect_uri='urn:ietf:wg:oauth:2.0:oob')
auth_url, _ = flow.authorization_url(prompt='consent')
print('Please go to this URL: {}'.format(auth_url))
code = input('Enter the authorization code: ')
credentials = flow.fetch_token(code=code)
# Call the Calendar API
now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time
print('Getting the upcoming 10 events')
calendarId='primary'
timeMin=now
maxResults=10
singleEvents=True
orderBy='startTime'
session = flow.authorized_session()
events = session.get(f'https://www.googleapis.com/calendar/v3/calendars/primary/events?calendarId={calendarId}&timeMin={timeMin}&maxResults={maxResults}&singleEvents={singleEvents}&orderBy={orderBy}').json()
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'])
上記のコードがそのままローカルで動くので、cloud functionに実装する際は、上記ではinputで受け取っている変数codeを、APIの引数として受け取るように実装すれば良い。