envied: 導入 使い方 - Ki-Kobayashi/flutter_wiki GitHub Wiki
🟩flutter_dotenvではなく、「envied」を使用する理由
- 🛑 flutter_dotenv: アセットフォルダに、隠したい情報が暗号化されず、平文保存
👉 リリース後、逆コンパイルにより、機密情報が漏洩するリスクがある
.
- 💎 envied(エンビード): 平文保存されることなく、難読化してくれる
👉 gitignoreに**「envファイル」「env.g.dart」を追加✅
👉 リリース時は、「envファイル」を削除📛しておく
(残しておくと平文残し**となり、逆コンパイルにより、機密情報が漏洩するリスク)
📚aarなどに固めたとき、ignoreで除外したファイルも、もろもろすべて組み込まれる(当たり前だが...)
.
🟩 パッケージのインストール
flutter pub add envied
flutter pub add build_runner --dev
flutter pub add envied_generator --dev
.
dependencies:
flutter:
sdk: flutter
envied: ^0.3.0+3 👈追加
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^2.4.6 👈追加
envied_generator: ^0.3.0+3 👈追加
.
🟩 .envの準備
🟡「.env」の作成
配置場所は任意
- プロジェクトのルートに配置
- scriptsフォルダー > envフォルダーを作成し、その中に配置
.
💎「.env」の例
# API_KEY名
API_KEY_NAME=xxxx-api-key
# 開発・テスト環境
API_KEY=XXxxxxxxxxxxxxx
# 本番環境環境(仮)
# API_KEY=YYYyyyyYYYyyyyyyy
# (テスト環境)プレフィックス「VITE_」を付けて定義
# PREFIX_APP_BUCKET_URL= https://sample-bucket-dev.s3.ap-northeast-1.amazonaws.com/"
# (ローカル環境)APIベースURL
# BASE_URL=http://localhost/api/v1/
# (テスト環境)APIベースURL
BASE_URL=https://sample-dev.example.com/api/v1/
# (テスト環境)xx共有用URLのPrefix
PREFIX_DEEP_LINK=https://sample-dev.example.com/xxxx/
.
🟩【.gitignore】に追加
以下を追加しないと、平文の機密情報がGithubなどにあがってしまい、漏洩の原因になる
# (単一のenvファイルがある場合)環境ファイル
.env
env.g.dart
# (複数のenvファイルがある場合)環境ファイル
*.env
*.env.g.dart
.
🟩 【env.dart】を作成
🚨各@EnviedField
に、【obfuscate: true
】をつけること
👉 開発中でも暗号化して自動生成ファイルを作成してくれる
※盗み見する**「ショルダーハッキング」の対策**になる
.
import 'package:envied/envied.dart';
part 'env.g.dart';
// @Envied() 👈「.env」をプロジェクトのルートに配置した場合
@Envied(path: 'scripts/env/.env') 👈「.env」を root/scripts/env 内に配置した場合
abstract class Env {
@EnviedField(varName: 'API_KEY_NAME', defaultValue: '', obfuscate: true) 👈 【obfuscate: true】開発中でも暗号化して自動生成ファイルを作成してくれる
static String apiKeyName = _Env.apiKeyName;
@EnviedField(varName: 'API_KEY', defaultValue: '', obfuscate: true)
static String apiKey = _Env.apiKey;
@EnviedField(varName: 'BASE_URL', defaultValue: '', obfuscate: true)
static String baseUrl = _Env.baseUrl;
@EnviedField(varName: 'PREFIX_DEEP_LINK', defaultValue: '', obfuscate: true)
static String prefixDeepLink = _Env.prefixDeepLink;
@EnviedField(
varName: 'PREFIX_APP_BUCKET_URL', defaultValue: '', obfuscate: true)
static String prefixAppBucketUrl = _Env.prefixAppBucketUrl ;
}
.
🟡 env.g.dart を生成する
下記コマンドを実行
fvm flutter pub run build_runner build --delete-conflicting-outputs
なんかおかしくなったら・・・・
以下コマンドを順に実行
fvm flutter clean
fvm flutter pub get
fvm flutter pub run build_runner build --delete-conflicting-outputs
env.g.dart が作成されれば成功!
.
🟩 呼び出し方
var dio = Dio()
..options = BaseOptions(
baseUrl: Env.baseUrl, 👈 Env.xxxXxxx 形式で呼ぶ
contentType: Headers.jsonContentType,
connectTimeout: const Duration(seconds: 15),
receiveTimeout: const Duration(seconds: 15),
);
.
🚨 リリース時
「.env」は削除して、aar / apk に固めること。
.
🟡オマケ: envファイルの役割
envファイルで完全にセキュリティOKではない。
あくまで難読化が限界値。
(これ以上難しくするとコンパイル不可能なため、apkなどはコードをユーザーにすべて公開しているという意識が重要)
envファイルとは・・・
- 情報を一元管理できる
- 少しでも読み取られにくくする
役割だということ
.
🟩
🟡
.
🟩
🟡
.