使用iOS应用程序中的服务帐户上载到Google云存储

使用iOS应用程序中的服务帐户上载到Google云存储,ios,objective-c,google-app-engine,google-cloud-storage,Ios,Objective C,Google App Engine,Google Cloud Storage,所以我一直在尝试将音频/视频文件从iOS应用程序上传到谷歌云服务器。 我想用户不必登录到他们的谷歌帐户前上传。 目前,我的工作解决方案是让服务器上的bucket“打开”,这基本上是 可供互联网上的每个人读取/写入存储桶。 我在iOS上为我的GTLServiceStorage对象设置API密钥: _serviceStorage.additionalHTTPHeaders = HTTP_HEADERS; _serviceStorage.APIKey = kCloudBackendAPIKey; 这

所以我一直在尝试将音频/视频文件从iOS应用程序上传到谷歌云服务器。 我想用户不必登录到他们的谷歌帐户前上传。 目前,我的工作解决方案是让服务器上的bucket“打开”,这基本上是 可供互联网上的每个人读取/写入存储桶。 我在iOS上为我的GTLServiceStorage对象设置API密钥:

_serviceStorage.additionalHTTPHeaders = HTTP_HEADERS;
_serviceStorage.APIKey = kCloudBackendAPIKey;
这样,应用程序中的用户应该能够在不登录的情况下上传

现在,我希望bucket是私有的,这样只有授权应用程序的用户才能访问它

在Android上, 我可以使用从服务器生成的证书来实现它,并将其实现到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应用程序中实现同样的机制。我是否可以使用google服务帐户id在iOS应用程序中上载文件,这样用户就不必首先登录到他们的google帐户?

将您的私钥保存在应用程序中对生产不安全,这不是正确的方法。 另外,你不能在IOS上使用同样的技巧

解决方案是创建一个公共api密钥(->项目->凭证->创建新密钥(在公共api访问下)->Android/IOS密钥

这应该足够安全,因为密钥可能绑定到您的android应用程序的sha-1和名称。 我应该注意的是,限制这一点对我来说还不起作用,所以在我将字段留空的同时,这使它成为“允许任何应用程序”-当我发现如何正确地执行此操作时,我将更新此答案

以下是我在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);
如果您有机会了解如何将使用限制为单个应用程序,我也希望听到答案:)


祝你好运

Hi@adipurnama,你找到这个问题的解决方案了吗?我也有同样的问题。adipurnama,cuGoku>你是否在你的Android手机应用程序中包含了私钥文件(.p12)和密码?如果是,安全吗?有解决方案吗?谢谢…有人发现了吗?不管在iOS设备上存储服务帐户的私钥是否是个好主意,问题仍然是Google Objective C OAuth 2库是否支持服务帐户的证书身份验证?(例如,在Mac上使用)我找不到任何设置私钥的方法。嗨,你有没有找到添加SHA1和软件包的方法来限制对单个android应用程序的访问?我总是把“需要登录”作为错误。不幸的是,现在还不是。目前它仍在使用“允许所有应用程序”。我很想知道你是否找到了解决办法没有解决办法。现在,我使用的是服务帐户类型的p12文件。但是我想知道我在哪里可以将p12文件隐藏到android应用程序中。。。令人难以置信的是,Android客户端没有任何解决方案。。。你有什么想法吗?