使用iOS应用中的服务帐户上传到Google云端存储

adi*_*ama 5 google-app-engine objective-c ios google-cloud-storage

所以我一直在努力将音频/视频文件从iOS应用程序上传到Google Cloud Server.我希望用户在上传之前无需登录他们的Google帐户.目前,我的工作解决方案是使服务器上的存储桶"打开",这基本上可供互联网上的每个人读/写存储桶.我在iOS上将API密钥设置为我的GTLServiceStorage对象:

_serviceStorage.additionalHTTPHeaders = HTTP_HEADERS;
_serviceStorage.APIKey = kCloudBackendAPIKey;
Run Code Online (Sandbox Code Playgroud)

这样,应用程序内的用户应该能够无需登录即可上传.

现在,我希望存储桶是私有的,因此只有授权应用程序的用户才能访问它.

在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
Run Code Online (Sandbox Code Playgroud)

但是,现在我似乎无法找到一种方法在我的iOS应用程序中实现相同的机制.有什么办法可以使用谷歌服务帐号来上传iOS应用程序中的文件,这样用户就不必先登录他们的goolge帐户了吗?

max*_*ron 1

将私钥保留在应用程序中对于生产来说并不安全,也不是正确的方法。另外,你不能在 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);
Run Code Online (Sandbox Code Playgroud)

如果您有机会知道如何将使用限制为单个应用程序,我也很想听到答案:)

祝你好运