LoginSignup
8
4

More than 3 years have passed since last update.

Heroku + Python で GoogleAPIを使うときにシークレットをソースに入れない話

Last updated at Posted at 2019-10-24

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
    1. DashBoard → 対象のApp → Setting → ConfigVars を開く
    2. Reveal Config Varsを開く
    3. 左側に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にしておきたいので、うまくいってよかった。

参考

8
4
1

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
8
4