我在flutter应用程序中使用googleapis服务,该服务需要一些JSON格式的凭据。在我的应用程序中存储此凭据的最佳方法是什么?
我可以将JSON文件保留在资产文件夹中并在主函数中读取该文件吗?
还是应该在主要功能中对凭证进行硬编码?我是开发开发的新手。
我的代码如下所示
import 'package:googleapis/storage/v1.dart';
import 'package:googleapis_auth/auth_io.dart';
final _credentials = new ServiceAccountCredentials.fromJson(r'''
{
"private_key_id": ...,
"private_key": ...,
"client_email": ...,
"client_id": ...,
"type": "service_account"
}
''');
const _SCOPES = const [StorageApi.DevstorageReadOnlyScope];
void main() {
clientViaServiceAccount(_credentials, _SCOPES).then((http_client) {
var storage = new StorageApi(http_client);
storage.buckets.list('dart-on-cloud').then((buckets) {
print("Received ${buckets.items.length} bucket names:");
for (var file in buckets.items) {
print(file.name);
}
});
});
}
我应该保留以下凭据的地方:
{
"private_key_id": ...,
"private_key": ...,
"client_email": ...,
"client_id": ...,
"type": "service_account"
}
我不认为像上面这样的硬编码是个好主意。
我认为这应该可行:https://medium.com/@sokrato/storing-your-secret-keys-in-flutter-c0b9af1c0f69
谢谢。
答案 0 :(得分:7)
评论::我不知道Robin如何回答问题。原始发布者需要应用程序具有访问API的凭据。使用安全密钥存储不会为应用程序提供任何数据,因此它仍然无法访问API。如果将文件添加到项目中,则安全密钥存储不会以任何方式保护文件。
环境变量:我建议将环境变量用于随环境而变化的变量:您可能有2个API_KEYS,因为您具有生产和测试环境。但是,拥有您应用的攻击者仍然可以通过``中间人''处理您的请求来窃取此信息,例如使用proxyman.tacker可以嗅探流量或反编译您的应用以窃取API_KEYS并自己使用它们项目,漏洞利用或加密采矿。
后端:因此,如果API_KEY功能强大且不受限制,则完全不应在应用程序上使用它。它应该在您的后端中,该后端代表客户端调用外部API。您可以托管服务器来执行此操作,也可以使用无服务器功能(例如AWS Lambda,GCP云功能,Azure功能,Firebase云功能等等)。
这取决于您的威胁模型:您认为可能对应用程序构成什么样的威胁。就我而言,我并不担心有人反编译我的hackathon项目以窃取我免费获得的天气API_KEY,但是我担心某些github爬虫或api提供程序会找到该api_key并将其禁用(这发生在我朋友使用她的Google Cloud Platform服务帐户凭据)。因此,我正在使用环境变量。
答案 1 :(得分:3)
要存储敏感信息(例如凭据),您应该使用iOS平台下的钥匙串和Android下的钥匙库。
有一个名为flutter_secure_storage
的完美库。
使用方法如下:
// Create storage
final storage = new FlutterSecureStorage();
// Store password
await storage.write(key: "password", value: "my-secret-password");
// Read value
String myPassword = await storage.read(key: "password");
要使用它,请向您flutter_secure_storage: 3.2.1+1
添加pubspec.yaml
并在终端中运行flutter packages get
。
以下是该软件包以及有关如何使用它的更详细的示例: https://pub.dartlang.org/packages/flutter_secure_storage
答案 2 :(得分:0)
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
/*
* Example of a secure store as a Mixin
* Usage:
import '../mixins/secure_store_mixin.dart';
MyClass extends StatelessWidget with SecureStoreMixin {
exampleSet(){
setSecureStore('jwt', 'jwt-token-data');
}
exampleGet(){
getSecureStore('jwt', (token) { print(token); });
}
}
*/
class SecureStoreMixin{
final secureStore = new FlutterSecureStorage();
void setSecureStore(String key, String data) async {
await secureStore.write(key: key, value: data);
}
void getSecureStore(String key, Function callback) async {
await secureStore.read(key: key).then(callback);
}
}
注意:通过添加更多方法进行扩展:
Map<String, String> allValues = await secureStore.readAll();
await secureStore.delete(key: key);
await secureStore.deleteAll();