2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

サーバーサイドからOAuth認証が必要なAPIを叩く

Last updated at Posted at 2021-03-10

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の引数として受け取るように実装すれば良い。

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?