Flutterのdart-defineを使ってAPIキーを隠蔽する
Google の API キーなどを秘匿情報をソースコードにハードコーディングして Github などに上げてしまうと、その API キーが悪用される恐れがあります。
本人が気づかないうちに API キーを悪用され膨大な利用料金が請求される可能性がある訳です。
API キーなどの秘匿情報は環境変数で設定してソースコードから値を取得するようにしましょう。
環境
- macOS Big Sur 11.2.3
- Android Studio 4.1.3
- Flutter 2.0.3
- Dart 2.12.2
コマンドラインで環境変数を定義する
環境変数である dart-define は以下のフォーマットで設定します。
--dart-define=ENVIRONMENT_NAME=value
- 通常の開発時にコマンドラインのデバッグビルドで dart-define を定義する例
$ flutter run --debug --dart-define=GOOGLE_API_KEY=dummy_key
- Circle CI や Github Actions など CI 環境からリリースビルドで dart-define を定義する例
$ flutter run --release --dart-define=GOOGLE_API_KEY=dummy_key
dart-define で定義した環境変数は通常 Dart のソースコードからしか取得できません。
iOS ネイティブである Swift のソースコードや Android ネイティブの設定ファイルである AndroidManifest.xml で dart-define の値を利用するにはネイティブ側に環境変数を渡す必要があります。
以前その方法を記事にしてますので、dart-define の値をネイティブ側で使用したい方はこちらをご覧ください。
Android Studio に環境変数を設定する
コマンドラインで環境変数を定義する方法の他、IDE で環境変数を設定することもできます。
開発時は IDE から Run や Debug を実行したい方はこれから紹介する方法で環境変数を設定してください。
Android Studio で --dart-define
で環境変数を設定するには Configurations
画面から行います。
画面上部の main.dart
をクリックするとプルダウンで Edit Configurations...
が選択できます。
Configurations 画面を開いて Additional run args
に --dart-define
を入力します。
今回は GOOGLE_API_KEY
という名前の環境変数を設定しました。
--dart-define=GOOGLE_API_KEY=dummy_key
ちなみに VSCode でも環境変数の設定が可能です。
詳しくは こちら の記事を参照ください。
Dart のソースコードから環境変数の値を取得する
Dart のソースコードから環境変数の値を取得する場合は String.fromEnvironment
で取得します。
bool の値は bool.fromEnvironment
で取得します。
bool 値は以下のように設定できます。
--dart-define=BOOL_VALUE=true
取得フォーマットはこちらです。
String.fromEnvironment('STRING_VALUE');
bool.fromEnvironment('BOOL_VALUE');
環境変数を複数の箇所から利用する場合を想定して以下のように纏めて宣言しておくと使いやすいです。
class EnvironmentVariables {
static const googleApiKey = String.fromEnvironment('GOOGLE_API_KEY');
static const isDebugging = bool.fromEnvironment('IS_DEBUGGING');
}
プログラムからはこんな感じで呼び出せます。
static const baseMapURL = 'https://maps.googleapis.com/maps/api/staticmap';
final apiKey = 'key=${EnvironmentVariables.googleApiKey}';
:
:
:
final imageUrl = '$baseMapURL?$mapCenter&$mapZoom&$mapMarkers&$mapSize&$apiKey';