有没有办法保护Google云端点原型数据存储? 我的设置: Python,谷歌应用程序引擎,使用endpoints_proto_数据存储 iOS,端点Obj-C客户端库生成器 背景

有没有办法保护Google云端点原型数据存储? 我的设置: Python,谷歌应用程序引擎,使用endpoints_proto_数据存储 iOS,端点Obj-C客户端库生成器 背景,python,google-app-engine,google-cloud-endpoints,endpoints-proto-datastore,Python,Google App Engine,Google Cloud Endpoints,Endpoints Proto Datastore,我已经安装了一个测试GoogleCloudEndpointsAPI,并且运行得非常快。使用iOS模拟器中的测试应用程序,并使用谷歌的API浏览器,它工作得非常好。该API目前对所有人开放,没有身份验证 我想:设置应用程序可以使用的API密钥或系统凭据,以确保只有它可以访问API——其他所有API都被拒绝 Google Endpoints Auth docs(1)中的方法是使用Google开发者控制台(2)创建OAuth 2.0客户端ID。因此,我为已安装的应用程序创建了一个ID,类型为:iOS。

我已经安装了一个测试GoogleCloudEndpointsAPI,并且运行得非常快。使用iOS模拟器中的测试应用程序,并使用谷歌的API浏览器,它工作得非常好。该API目前对所有人开放,没有身份验证

我想:设置应用程序可以使用的API密钥或系统凭据,以确保只有它可以访问API——其他所有API都被拒绝

Google Endpoints Auth docs(1)中的方法是使用Google开发者控制台(2)创建OAuth 2.0客户端ID。因此,我为已安装的应用程序创建了一个ID,类型为:iOS。到目前为止还不错

在应用程序中,GTLService对象如下所示

-(GTLServiceDemogaeapi *)myApiService {
    GTMOAuth2Authentication *auth = [[GTMOAuth2Authentication alloc] init];
    auth.clientID = @"10???????????????????ie.apps.googleusercontent.com";
    auth.clientSecret = @"z????????????3";
    auth.scope = @"https://www.googleapis.com/auth/userinfo.email";

    static GTLServiceDemogaeapi *service = nil;
    if (!service) {
        service = [[GTLServiceDemogaeapi alloc] init];
        service.authorizer = auth;
        service.retryEnabled = YES;
        [GTMHTTPFetcher setLoggingEnabled:YES];
    }
    return service;
 }
在GAE上,我指定了(允许的客户机ID),并在方法中添加了用户检查

@endpoints.api(name='demogaeapi', version='v1',
               allowed_client_ids=['10?????????????ie.apps.googleusercontent.com',
               endpoints.API_EXPLORER_CLIENT_ID],
               scopes=[endpoints.EMAIL_SCOPE],
               description='My Demo API')
class MyApi(remote.Service):

    @TestModel.method(path='testmodel/{id}', name='testmodel.insert', http_method='POST')
    def testModelInsert(self, test_model):

        current_user = endpoints.get_current_user()
        if current_user is None:
            raise endpoints.UnauthorizedException('Invalid token.')
问题 当前用户始终为None,因此该方法将始终引发异常。这似乎是一个已知的问题问题问题8848:Google Cloud Enpoints get_当前用户API未填充用户id(3),并且没有很快修复的前景

选择?
  • 等到谷歌解决问题8848。不能真的,我们有一个产品发布
  • 编辑:2015年5月15日-谷歌发行的第8848期status WontFix

  • 我发现可以使用API密钥,但尽管我已经创建了一个,但我还没有找到在后端启用它的方法。我还注意到,这种方法有一个很大的漏洞,谷歌的API浏览器可以击败它。见问题(4)

  • 此处(5)描述的@endpoints.api参数:auth_level是否提供了答案?我尝试使用:

    @endpoints.api(name='demogaeapi', version='v1',
           auth_level=endpoints.AUTH_LEVEL.REQUIRED,
           scopes=[endpoints.EMAIL_SCOPE],
           description='My Demo API')
    
    但是能够在不使用凭据的情况下从客户端应用程序使用api。因此,它显然没有添加任何身份验证

  • 将hiddenProperty添加到包含共享密钥的客户端查询中。如bossylobster(6)和Carlos(7)所述。我尝试了此操作,但看不到如何获取原始请求对象(另一个问题的主题)

  • 编辑:出现了另一个选项:

  • 使用Google开发者控制台(2)创建一个服务帐户。使用此帐户无需用户同意(通过UI)即可访问API。但是,Google似乎将通过这种方式添加的应用数量限制为15或20。请参阅Google OAuth2文档(8)。我们可能会超过此限制
  • 问题 有人知道我如何让这些选项发挥作用吗?或者我应该以不同的方式来处理这个问题吗

    正如你所看到的,我需要指导,帮助,想法


    因为我需要10个声誉来发布2个以上的链接:这里是我必须提取和添加的链接作为参考。这真的破坏了问题的流程

  • cloud.google.com/appengine/docs/python/endpoints/auth
  • console.developers.google.com/
  • code.google.com/p/googleappengine/issues/detail?id=8848
  • stackoverflow.com/a/26133926/4102061
  • cloud.google.com/appengine/docs/python/endpoints/create_api
  • stackoverflow.com/a/16803274/4102061
  • stackoverflow.com/a/26133926/4102061
  • developers.google.com/accounts/docs/OAuth2

  • 这是一个非常好的问题,也是一个真正的问题。我通过拥有自己的“用户”数据库表来解决它。写入时自动生成
    Long
    键(我使用Java),这是我从那时起唯一标识用户的值。该表中还写入了Google ID(如果通过网页调用,则提供)、电子邮件地址和iOS id(在未登录Google帐户的情况下使用iOS应用程序时)

    调用AppEngine端点时,我使用
    User
    参数中存在的信息(仅用于登录客户端的经过身份验证的电子邮件地址)或单独的可选
    iosid
    参数,以便从所述表中获取我的内部用户ID号,并从此使用该编号唯一标识我的用户


    我也使用同一个表来存储其他特定于用户的信息,因此它实际上与尝试使用
    current\u user
    作为主键没有什么不同,只是我必须创建三个字段(googleid、email、iosid)索引以供查找。

    这是一个研究得很好的问题。谢谢。我目前正在仔细阅读并做一些研究,但我只是想说谢谢你用大量相关信息清楚地阐述了你的问题。我觉得如果我们能共同努力找到答案,这可能是一个很好的问题,供未来用户参考,这就是SO的目的。这对我来说仍然是一个悬而未决的问题,我们的API需要安全。我一直忙于一个不同的模块,现在是时候回到这个问题上来了。所以我目前的想法是,选项4,bossy lobster建议的hiddenProperty,最有希望。你的想法是什么?我也遇到了这个问题,可能会被拒绝(非常)对答案感兴趣。此时,我正在使用一种变通方法,客户机在应用程序级别(通过HTTPS)传递API密钥(随机字符串)服务也会在应用程序级别进行检查。您是否尝试过Alex答案中的解决方法?现在看起来很有趣,我必须阅读几遍才能掌握选项。我们最终改变了产品的体系结构概念,这导致不再需要端点。
    @TestModel.method(path='testmodel/{id}', name='testmodel.insert', http_method='POST')
    def testModelInsert(self, test_model):
    
        mykey,keytype = request.get_unrecognized_field_info('hiddenProperty')
        if mykey != 'my_supersecret_key':
            raise endpoints.UnauthorizedException('No, you dont!')