FlaskアプリでGCPの認証を必要とするアプリを開発する時、本番環境と開発環境で認証方法を切り替える方法を解説します。
前提となる状況
Gスプレッドシートからデータを取得・表示するアプリを本番にデプロイ後、ローカル環境に戻って作業を再開したところ、認証エラーが発生した。
原因は、GCP認証に必要なJSONの読み取り方法を本番環境向けに固定していたため、開発環境で正しく認証が行えなかったことである。
JSONファイルの管理方法
本番環境と開発環境で、以下のようにJSON(GCPから発行されるファイル)の管理方法を切り替えることにした。
・開発環境ファイルで管理する。.envやgitignoreを使って安全に使える。
・本番環境では環境変数で一括管理する。ファイルのアップロードは手間がかかるうえ、セキュリティ上好ましくない。
これらを切り替える条件文を実装して、環境に合わせて認証を突破できるようにした。
ソースコード
以下、今回実装したコード。
# utils/gspread_client.py
import os
import json
import gspread
from dotenv import load_dotenv
from oauth2client.service_account import ServiceAccountCredentials
# 環境変数の読み込み(.env対応)
load_dotenv()
SCOPE = [
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/drive"
]
def get_gspread_client():
credentials_json_str = os.getenv("GOOGLE_CREDENTIALS_JSON")
if credentials_json_str:
# 本番環境など:環境変数にJSONがある場合
credentials_info = json.loads(credentials_json_str)
credentials = ServiceAccountCredentials.from_json_keyfile_dict(credentials_info, SCOPE)
else:
# 開発環境:credentials.jsonファイルを使う
credentials = ServiceAccountCredentials.from_json_keyfile_name("credentials.json", SCOPE)
client = gspread.authorize(credentials)
return client
ちなみに、envファイルでは認証用のcredentials.jsonに含まれていたJSONの文字列をそのままGOOGLE_CREDENTIALS_JSONに代入している。
プロジェクトフォルダ直下にもcredentials.jsonを置いており、else文(開発環境)で引数にとっているのはそのファイル。
おわりに
今回は、Flask × gspreadで開発と本番でGoogle認証を切り替える方法について、自分の体験をもとに解説しました。お役に立てましたら幸いです。
XやNoteもやっていますので、ぜひ覗きに来てください!