0
0

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】アプリ全体で API Keyを安全に取り扱う方法

Posted at

app.config["API_key"] と current_app["API_Key"]を活用

1. アプリ全体で API Keyを使えるようにする

  • Flaskの g に APIキー のようなアプリ全体で利用される情報を保存することは推奨されない。
  • g はリクエストごとにスレッド固有のデータを一時的に格納するためのものであり、APIキーのようなグローバルな設定を格納する用途には適していない
  • APIキーは、環境変数や設定ファイル (.env, config.py など) で管理し、アプリケーションが起動した際に一度ロードして使用するのが一般的
  • .envを使う方がベストプラクティスとして標準的な手法なっている
  • 環境変数にすることで、APIキーなどの機密情報をソースコードから分離することで、誤って公開してしまうリスクを大幅に減らすメリットがある
  • クラウドプロバイダーが提供する シークレット管理サービス(例:AWS Secrets ManagerやGoogle Cloud Secret Manager)を使用するもある
  • Flaskの app.config は、アプリケーション全体で設定値を管理するための辞書のような構造を持ったオブジェクト
  • Flaskアプリケーションの設定に関わるパラメータ(デバッグモードのオン・オフ、データベース接続設定、APIキーなど)を保存し、アプリ全体から参照することができる

ファイル構成

flask_app
   |- .env
   |- app.py
   |- functions
      |- __init__.py
      |- function.py
  • .env: 環境変数ファイル
  • app.py: Flaskのメインアプリ
  • function.py: アプリ内の分割されたファンクション(モジュール相当)

設定例 1

  • load_dotenv で.envを環境変数として読み込む
  • os.getenv()でapi_keyを読み込み、変数API_keyとして定義
  • app.config["API_key"]として

.env

api_key1="43785f92e7mshf1"
api_key2="AIzaSyD574tn5m7"

app.py

import os
from dotenv import load_dotenv
from flask import Flask

app = Flask(__name__)

load_dotenv()

app.config["API_key1"] = os.getenv("api_key1")
app.config["API_key2"] = os.getenv("api_key2")

function.py

from flask import current_app

API_Key1 = app.config["API_key1"]
API_Key2 = app.config["API_key2"]

設定例 2 (Blueprintが採用されている場合)

  • app が設定されないないため、function.pyに app.config["API_key"]を使えない
  • load_dotenv で.envを環境変数として読み込む
  • os.getenv()でapi_keyを読み込み、変数API_keyとして定義
  • Blueprintが採用されている場合、app.config["API_key"]が使えないため、代わりにcurrent_app["API_key"]を使う

.env (BP)

api_key1="43785f92e7mshf1"
api_key2="AIzaSyD574tn5m7"

app.py (BP)

import os
from dotenv import load_dotenv
from flask import Flask, current_app

app = Flask(__name__)

load_dotenv()

app.config["API_key1"] = os.getenv("api_key1")
app.config["API_key2"] = os.getenv("api_key2")

function.py (BP)

from flask import Blueprint, current_app

API_Key1 = current_app["API_key1"]
API_Key2 = current_app["API_key2"]

まとめ

  • Blueprintを使っている場合でも、.env に保存された環境変数を load_dotenv を使ってFlaskの app.config に読み込み、Blueprint内では current_app を使って参照すれば、環境変数(APIキーなど)を安全かつ簡単に利用できる
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?