Googleのサービスは無料な上に大変便利ですね。そんなサービスをPythonからでもかんたんに使うことができますが、認証に関連するファイルはgitに含めないようにするのはお約束。そんな話です。
状況
- Herokuで動いているアプリケーションでGoogleのAPIを使う
- Google DriveやCalendarの
QuickStart.py
はGoogleから提供されるクライアント情報をclient_secret.json
をというファイルに保存して使っている - Herokuはgit連携で使っている
やりたいこと
- ソースを公開できるように
client_secret.json
をgitの管理対象にしたくない - その上でGoogleのサービスを使えるようにしたい
やったこと
環境変数に書き込む
Herokuの環境変数にclient_secret.json
の内容をそのまま入れてしまうことにしました。というかそのまま変数に入るのが驚きです。
- CUI
$ heroku config:set {お好みのKEY}=$(cat client_secret.json)
- Web
- DashBoard → 対象のApp → Setting → ConfigVars を開く
- Reveal Config Varsを開く
- 左側にKEY,右側に
client_secret.json
の中身を全部コピペしてAddをクリック
環境変数に追加したら、os.environ[KEY]
でpythonからアクセスできるようになります。
認証オブジェクト作成につかうメソッドを変更する
Quickstart.py
では
flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRET_FILE, SCOPES)
のようにInstalledAppFlow.from_client_secrets_file
を使っていますが、名前が_~_file_ということは当然ファイル以外から読み出す方法があるはずと考えました。
ありました。
InstalledAppFlow.from_client_config
を使えばファイルではなくjsonオブジェクトから認証オブジェクトを作れるようです。なのでオブジェクト作成部分を以下のように変更しました。
import os
import json
from google_auth_oauthlib.flow import InstalledAppFlow
SCOPES = [
# 利用するスコープ
"https://www.googleapis.com/auth/drive.file"
]
# 環境変数の中身をjsonにパースしてから利用する
secret = json.loads(os.environ[{さっき指定したKEY}])
oath_obj = InstalledAppFlow.from_client_config(secret,SCOPE)
おわり
こうすることで見せたくないものを公開せずにHerokuに今までどおりデプロイできるようになりました。せっかく作ったものはgithubでpublicにしておきたいので、うまくいってよかった。
参考
- google_auth_oauthlib.flow module — google-auth-oauthlib 0.4.1 documentation
https://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.html