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帐户了吗?
将私钥保留在应用程序中对于生产来说并不安全,也不是正确的方法。另外,你不能在 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)
如果您有机会知道如何将使用限制为单个应用程序,我也很想听到答案:)
祝你好运
归档时间: |
|
查看次数: |
915 次 |
最近记录: |