1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Flask × gspreadで開発と本番でGoogle認証を切り替える方法

Posted at

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もやっていますので、ぜひ覗きに来てください!

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?