将API凭证存储在Flutter应用程序中

时间:2019-04-13 07:47:43

标签: dart flutter flutter-dependencies

我在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

谢谢。

3 个答案:

答案 0 :(得分:7)

评论::我不知道Robin如何回答问题。原始发布者需要应用程序具有访问API的凭据。使用安全密钥存储不会为应用程序提供任何数据,因此它仍然无法访问API。如果将文件添加到项目中,则安全密钥存储不会以任何方式保护文件。


2种方法

环境变量:我建议将环境变量用于随环境而变化的变量:您可能有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();