はじめに
Flutterアプリ開発において、APIキーやデータベースパスワードなどの機密情報を安全に管理することは非常に重要です。本記事では、envied
パッケージを使用して環境変数を安全に管理する方法を解説します。
1. enviedのインストール
まず、Flutterプロジェクトにenvied
パッケージを追加します。
flutter pub add envied
flutter pub add --dev build_runner envied_generator
envied
は環境変数を安全に管理するためのパッケージで、build_runner
とenvied_generator
を利用してコードを自動生成します。
2. .envファイルの作成
環境変数を定義するために、.env
ファイルをプロジェクトのルートディレクトリに作成し、以下のように記述します。
DB_PASSWORD=1234567890
DB_PORT=3000
このファイルには機密情報を含むため、.gitignore
に追加してバージョン管理から除外してください。
echo ".env" >> .gitignore
echo "env.g.dart" >> .gitignore # のちに生成されるファイル
3. 環境変数を管理するファイルを作成
次に、lib/env.dart
というファイルを作成し、以下のコードを記述します。
import 'package:envied/envied.dart';
part 'env.g.dart';
// requireEnvFileがtrueの場合、.envファイルがないとエラーが出る
@Envied(requireEnvFile: true, path: '.env')
final class Env {
@EnviedField(varName: 'DB_PASSWORD')
static const String dbPassword = _Env.dbPassword;
@EnviedField(varName: 'DB_PORT')
static const String dbPort = _Env.dbPort;
}
このファイルでは、@Envied
アノテーションを使用して.env
ファイルから環境変数を読み込むように設定します。
4. env.g.dartの生成
環境変数を自動生成するために、以下のコマンドを実行します。
flutter pub run build_runner build --delete-conflicting-outputs
このコマンドを実行すると、env.g.dart
というファイルが自動生成されます。
生成されるenv.g.dart
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'env.dart';
// ************************************************************************
// EnviedGenerator
// **********************************************************************
// coverage:ignore-file
// ignore_for_file: type=lint
// generated_from: .env
final class _Env {
static const String dbPassword = '1234567890'; // envの中身がここにくる
static const String dbPort = '3000';
}
このファイルが生成されたら、.env
ファイルは削除しても問題ありません。
rm .env
5. 環境変数の使用方法
アプリケーション内で環境変数を使用する際は、以下のように呼び出します。
import 'env.dart';
void main() {
print(Env.dbPassword);
print(Env.dbPort);
}
このコードを実行すると、.env
ファイルに定義した値が出力されます。
6. enviedが環境変数を管理する上で安全な理由
なぜ、このような手間をかけて、環境変数を管理する必要があるのでしょうか?
それは、enviedが環境変数を暗号化してくれるからです。
通常この暗号化は、アプリのビルド時に行われます。
ただ、開発の段階で、環境変数を暗号化する機能もあります。
import 'package:envied/envied.dart';
part 'env.g.dart';
@Envied(requireEnvFile: true, path: '.env')
final class Env {
// 暗号化する場合は、obfuscate: trueを追加
@EnviedField(varName: 'DB_PASSWORD', obfuscate: true)
static String dbPassword = _Env.dbPassword;
@EnviedField(varName: 'DB_PORT')
static String dbPort = _Env.dbPort;
}
暗号化された場合(今回だとdbPassword
)、生成されるenv.g.dart
は以下のようになります。
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'env.dart';
// **********************************************************************
// EnviedGenerator
// ************************************************************************
// coverage:ignore-file
// ignore_for_file: type=lint
// generated_from: .env
final class _Env {
static const List _enviedkeydbPassword = [
3175743209,
3642003943,
2774983698,
2234134847,
776266119,
3460629094,
2118227522,
209157887,
2325619839,
559751284,
];
static const List _envieddatadbPassword = [
3175743192,
3642003925,
2774983713,
2234134795,
776266162,
3460629072,
2118227573,
209157831,
2325619782,
559751236,
];
static final String dbPassword = String.fromCharCodes(List.generate(
_envieddatadbPassword.length,
(int i) => i,
growable: false,
).map((int i) => _envieddatadbPassword[i] ^ _enviedkeydbPassword[i]));
static const String dbPort = '3000';
}
まとめ
envied
を利用することで、安全に環境変数を管理できる。.env
ファイルはバージョン管理から除外する。env.g.dart
も.gitignore
に追加する。build_runner
を使用してenv.g.dart
を自動生成する。- 生成された
env.g.dart
を使用して環境変数を取得する。
この方法を活用することで、Flutterアプリのセキュリティを向上させることができます。ぜひ、試してみてください!