ios - 使用服务帐户从 iOS 应用上传到 Google Cloud Storage

标签 ios objective-c google-app-engine google-cloud-storage

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

_serviceStorage.additionalHTTPHeaders = HTTP_HEADERS;
_serviceStorage.APIKey = kCloudBackendAPIKey;

这样,应用内的用户无需登录即可上传。

现在,我希望存储桶是私有(private)的,这样只有来自授权应用的用户才能访问它。

在安卓系统上, 我可以使用从服务器生成的证书并将其实现到 Android 项目文件中 通过 Google 文档页面中的示例。 (使用服务帐户 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 应用程序中实现相同机制的方法。有什么方法可以使用谷歌服务帐户 ID 在 iOS 应用程序中上传文件,这样用户就不必先登录他们的 goolge 帐户了吗?

最佳答案

将您的私钥保存在应用程序中对于生产而言并不安全,也不是执行此操作的正确方法。 此外,您不能对 IOS 使用相同的技巧。

解决方案是创建一个公共(public) api key (https://console.developers.google.com -> 项目 -> 凭据 -> 创建新 key (在公共(public) api 访问下) -> Android/IOS key 。

这应该足够安全,因为 key 可能与您的 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);

如果您有机会了解如何将使用限制在单个应用程序中,我也很乐意听到答案:)

祝你好运

关于ios - 使用服务帐户从 iOS 应用上传到 Google Cloud Storage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23361424/

相关文章:

objective-c - 为什么 [NSDate date] 返回 id?

python - 部署 Python 灵活应用程序引擎,无需入口点,只需 cron 作业

python - 在 2018 年 3 月 1 日之前将 App Engine Python ssl 升级到 2.7.11

ios - 维护 SQL 数据库中 Flex 任务的相对顺序

ios - iOS10 的 uiView 在 ViewController 内错位,但 iOS11 则不然

ios - Objective C 中类型的 Typedef NSArray

java - 无法使用GAE运行Web项目

ios - FBSDKLoginManager 返回 "You have already authorized foobar"并且不重定向到我的 View

iOS-Web服务: Webservice for iOS client

ios - 如何将 RGB 颜色转换为 HTML 颜色?