flutter_secure_storage: 導入 使い方 - Ki-Kobayashi/flutter_wiki GitHub Wiki
https://pub.dev/packages/flutter_secure_storage
flutter_secure_storageは安全にデータを保存することができます。
iOSの場合は、キーチェーンを使用してデータを保存し、Androidの場合は、AES暗号化が使用されキースト アに保存されます。
iOSの場合は、キーチェーンを使用しているため、アプリを削除してもデータが残ります。
Androidの場合は、アプリを削除するとデータも削除されるためshared_preferencesと同じ挙動になります。
.
[project]/android/app/build.gradle set minSdkVersion to >= 18. 👈これ以上にする
https://github.com/mogol/flutter_secure_storage/issues/43
<application
...
android:allowBackup="false"
android:fullBackupContent="false" 👈以下かいずれかを設定
android:fullBackupContent="@xml/backup_rules"> 👈使用経験ではこちらを設定していた
.
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<exclude domain="sharedpref" path="FlutterSecureStorage"/>
</full-backup-content>
.
part 'app_providers.g.dart';
@Riverpod(keepAlive: true)
FlutterSecureStorage flutterSecureStorage(FlutterSecureStorageRef ref) {
throw UnimplementedError();
}
.
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
runApp(
ProviderScope(
overrides: [
sharedPreferencesProvider.overrideWithValue(
await SharedPreferences.getInstance(),
),
flutterSecureStorageProvider.overrideWithValue(
const FlutterSecureStorage(),
),
.
part 'secure_storage_repository.g.dart';
@riverpod
SecureStorageRepository secureStorageRepository(
SecureStorageRepositoryRef ref,
) {
return SecureStorageRepository(
secureStorage: ref.read(flutterSecureStorageProvider),
);
}
class SecureStorageRepository {
SecureStorageRepository({
required FlutterSecureStorage secureStorage,
}) : _secureStorage = secureStorage;
final FlutterSecureStorage _secureStorage;
/// 書き込み
Future<void> writeParam1({
required String param,
}) async {
await _secureStorage.write(
key: ConstSharedPrefKeys.param1Key,
value: param,
aOptions: _getAndroidOptions(),
);
}
/// 読み出し
Future<String?> readParam1() async {
return await _secureStorage.read(
key: ConstSharedPrefKeys.param1Key,
aOptions: _getAndroidOptions(),
);
}
/// 削除
Future<void> deleteParam1() async {
await _secureStorage.delete(
key: ConstSharedPrefKeys.param1Key,
aOptions: _getAndroidOptions(),
);
}
/// Keyがセキュアストレージに存在するか
Future<bool> containsKeyInSecureStorage(String key) async {
var containsKey = await _secureStorage.containsKey(
key: key,
aOptions: _getAndroidOptions(),
);
return containsKey;
}
AndroidOptions _getAndroidOptions() => const AndroidOptions(
encryptedSharedPreferences: true,
);
// 👇以下は必要があれば(first_unlockまたはfirst_unlock_this_deviceを指定することで、安全な値を取得できます。指定しない場合のデフォルトはロック解除)
// https://pub.dev/packages/flutter_secure_storage#getting-started
IOSOptions _getAndroidOptions() => const IOSOptions(
accessibility: IOSAccessibility.first_unlock,
);
}
.
// 保存
Future<void> _saveParam1(WidgetRef ref, String param1) async {
final secureStorageRepository = ref.read(secureStorageRepositoryProvider);
if (await secureStorageRepository
.containsKeyInSecureStorage(ConstSharedPrefKeys.param1Key)) {
await secureStorageRepository.deleteParam1();
}
await secureStorageRepository.writeParam1(param: param1);
// 👇確認したければ以下
final savedParam1 = await secureStorageRepository.readParam1();
}
.
.
.
.
.