[英]How to upload to Google Drive Storage from an iOS app via Service Account Authentication?
[英]Upload to Google Cloud Storage using service account from iOS app
所以我一直在努力将音频/视频文件从iOS应用程序上传到Google Cloud Server。 我希望用户在上传之前无需登录他们的Google帐户。 目前,我的工作解决方案是使服务器上的存储桶“打开”,这基本上可供互联网上的每个人读取/写入存储桶。 我在iOS上将API密钥设置为我的GTLServiceStorage对象:
_serviceStorage.additionalHTTPHeaders = HTTP_HEADERS;
_serviceStorage.APIKey = kCloudBackendAPIKey;
这样,应用程序内的用户应该能够无需登录即可上传。
现在,我希望存储桶是私有的,因此只有授权应用程序的用户才能访问它。
在Android上,我可以使用我从服务器生成的证书来完成它,并通过Google文档页面中的示例将其实现到Android项目文件。 (使用服务帐户ID和PKCS12文件)。 Android上设置凭证的代码如下:
KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(getResources().openRawResource(R.raw.secret), MY_PASSWD.toCharArray());
PrivateKey key = (PrivateKey) keystore.getKey("privatekey", MY_PASSWD.toCharArray());
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(SERVICE_ACCOUNT_ID)
.setServiceAccountScopes(scopes)
.setServiceAccountPrivateKey(key)
.build();
storage = new Storage.Builder(httpTransport, jsonFactory, credential)
.setApplicationName(APP_NAME).build();
// --- continue upload using storage
但是,现在我似乎无法找到一种方法在我的iOS应用程序中实现相同的机制。 有什么办法可以使用谷歌服务帐号来上传iOS应用程序中的文件,这样用户就不必先登录他们的goolge帐户了吗?
将您的私钥保存在应用程序中对于生产来说是不安全的,并且不是正确的方法。 此外,您不能使用与IOS相同的技巧。
解决方案是创建公共API密钥( https://console.developers.google.com - >项目 - >凭证 - >创建新密钥(在公共API访问下) - > Android / IOS密钥。
这应该足够安全,因为密钥可能与sha-1和Android应用程序的名称相关联。 我应该注意到,虽然限制这一点对我来说还没有用,所以在同一时间我把场留空了,这使得它“允许任何应用程序” - 当我发现如何正确地做这件事时,我会更新这个答案。
这是我在android中做到这一点的方式:
HttpTransport httpTransport = new NetHttpTransport();
JsonFactory jsonFactory = AndroidJsonFactory.getDefaultInstance();
mStorage = new Storage.Builder(httpTransport, jsonFactory, null)
.setApplicationName(PROJECT_ID)
.build();
...
...
mStorage.objects()
.get(BUCKET_NAME, fileName)
.setKey(API_KEY)
.setAlt("media")
.executeAndDownloadTo(stream);
如果您有任何机会了解如何将使用限制在单个应用程序中,我也很乐意听到答案:)
祝好运
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.