首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用iOS应用程序的包标识符“授权”上传到?

如何使用iOS应用程序的包标识符“授权”上传到?
EN

Stack Overflow用户
提问于 2015-05-23 16:28:36
回答 1查看 1.8K关注 0票数 2

我们的服务使用Google作为后端,我们现在正在实现图像等的上传功能。

在这里,我使用了堆叠中几个不同问题的答案,使它发挥了作用,但不是完全按照我的意愿。我们不使用内置的OAuth等,目前我们希望存储是公开的,但不是完全公开的。我们想把它限制在我们自己的应用程序的用户(即没有认证)。在云控制台中,我们可以为iOS创建一个API键。这样做时,我们将API键复制到应用程序中,并将其与每个上传请求一起传递。当桶-权限设置为allUsers - WRITE时,这是当前工作的。

然而,在API-key中,我们可以提供我们的应用程序自己的包标识符,因此,据推测,只允许来自应用程序的请求。(显然,也允许应用商店ID/URL )。添加这个包id,只要存储桶有权限allUsers - WRITE,就不会做任何操作。如果我将bundle-id更改为与实际的bundle-id不匹配,它仍然有效。那么,桶应该使用哪些权限来使API-key中的bundle-id应用?在iOS (acl?)上的上传代码中应该发送什么?

如果删除allUsers-permission并使用其他内容,则在试图上载时会出现以下错误:

代码语言:javascript
复制
{message:"There is a per-IP or per-Referer restriction configured 
          on your API key and the request does not match these
          restrictions. Please use the Google Developers Console 
          to update your API key configuration if request from this
          IP or referer should be allowed." data:[1] code:403}}

我现在就是这样使用它的(虽然我尝试过几个不同的东西,但都是从不同的问题/答案中学到的):

代码语言:javascript
复制
GTLServiceStorage *serv = [[GTLServiceStorage alloc] init];    
serv.additionalHTTPHeaders = [NSDictionary dictionaryWithObjectsAndKeys:
                               @"[my project id]", @"x-goog-project-id",
                              @"application/json-rpc", @"Content-Type",
                               @"application/json-rpc", @"Accept", nil];
serv.APIKey = @"[my iOS API key, gotten from console, (linked to bundle-id?)]";
serv.retryEnabled = YES;

GTLStorageBucket *bucket = [[GTLStorageBucket alloc] init];
bucket.name = @"[my bucket]";

GTLUploadParameters *params = [GTLUploadParameters uploadParametersWithFileHandle:fileHandle MIMEType:@"image/jpeg"];
GTLStorageObject *storageObject = [[GTLStorageObject alloc] init];
storageObject.name = @"testFile.jpg";

//I have no idea what I'm doing with the following stuff, but I've tried several things:
GTLStorageObjectAccessControl *objAccessControl
= [GTLStorageObjectAccessControl new];

//This is working
objAccessControl.entity = @"allUsers";
objAccessControl.email = @"[my app-id]@project.gserviceaccount.com";
objAccessControl.role = @"OWNER";

//If I try this instead, it is not working.
//objAccessControl.domain = @"[my app-id].apps.googleusercontent.com";
//objAccessControl.role = @"WRITER";
//Probably because it's bullshit, I have no idea what I'm doing.

storageObject.acl = @[objAccessControl];

[...] //Bucket and upload and stuff. It seems like it's the ACL-thing above that's not working..

似乎我必须以某种方式将存储桶上的权限连接到iOS API密钥,但我不知道这是否可能。

我想要的是:所有用户都可以使用云,因为他们是从我的iOS应用程序中请求的。

EN

回答 1

Stack Overflow用户

发布于 2016-05-21 18:41:58

由于这个问题从来没有得到答案,我将在这里添加一个,根据目前的信息在文章中。

您得到错误的原因是“每个IP或每个引用程序都有限制.”使用GCS键调用GCS时,只需使用iOS 不适用于私有数据的API密钥 (即。使用OAuth)。没有什么可以让API的关键与GCS直接与私有数据一起工作。当您将“allUsers- when”设置为ACL时,它工作的原因很简单,因为ACL允许公共访问。

要在不需要用户干预的情况下访问私有数据,需要一个服务帐户,但是Google目标-C客户机只支持OAuth2客户端ID。其基本原理是,服务帐户仅用于服务器端身份验证。在客户端中使用服务帐户将涉及到将私钥与应用程序一起分发,这很容易被破坏。作为参考,下面是如何使用OAuth授权GCS服务的示例:

代码语言:javascript
复制
NSString *keychainItemName = @"My App";
NSString *clientID = <your-client-id>;
NSString *clientSecret = <your-client-secret>;

// How to check for existing credentials in the keychain
GTMOAuth2Authentication *auth;
auth = [GTMOAuth2WindowController authForGoogleFromKeychainForName:kKeychainItemName
                                                          clientID:clientID
                                                      clientSecret:clientSecret];

...

// How to set up a window controller for sign-in
NSBundle *frameworkBundle = [NSBundle bundleForClass:[GTMOAuth2WindowController class]];
GTMOAuth2WindowController *windowController;
windowController = [GTMOAuth2WindowController controllerWithScope:kGTLAuthScopeStorageDevstorageFullControl
                                                         clientID:clientID
                                                     clientSecret:clientSecret
                                                 keychainItemName:kKeychainItemName
                                                   resourceBundle:frameworkBundle];

[windowController signInSheetModalForWindow:[self window]
                            completionHandler:^(GTMOAuth2Authentication *auth,
                            NSError *error) {
  if (error == nil) {
    self.storageService.authorizer = auth;
  }
}];

...

// Initialize service with auth
GTLServiceStorage *serv = [[GTLServiceStorage alloc] init];    
serv.authorizer = auth;

所有这些都来自google objectivec- GitHub页面上的GitHub,因此您可以参考它获得一个包含上下文的完整示例。

这仍然留下了一个问题,即如何在没有用户授权的情况下从iOS实现对GCS的访问。对此的简单回答是,iOS密钥可以用于托管在Google云终结点上的自己的后端API的限制访问,而后端应用程序可以使用服务帐户(通常是application服务帐户)对GCS进行授权。云存储客户端库示例页面具有使用不同语言的默认凭据的示例。

关于如何为此目的实现终结点API的更多细节可能超出了这个问题的范围,但这应该是一个很好的起点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30415022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档