¿Hay alguna manera de proteger los puntos finales de la nube de Google proto datastore?

mi configuración:Python, motor de aplicaciones de Google que utiliza endpoints_proto_datastoreiOS, puntos finales Generador de la biblioteca del cliente Obj-CAntecedentes

He configurado una API de prueba de puntos finales en la nube de Google y la hice correr bastante rápido. Funciona muy bien, usando la aplicación de prueba en el simulador de iOS y usando el Explorador de API de Google. La API está actualmente abierta para todos sin autenticación.

Me gustaría:configurar una clave API o una credencial del sistema que pueda usar la aplicación para garantizar que solo pueda acceder a la API - con todos los demás siendo rechazados.

El método en elDocumentos de autenticación de Google Endpoints (1) es crear una ID de cliente OAuth 2.0 utilizando elConsola de desarrolladores de Google (2) Así que he creado una identificación para una aplicación instalada de tipo: iOS. Hasta aquí todo bien.

En la aplicación, el objeto GTLService se ve así ...

-(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;
 }

En GAE, especifiqué (allow_client_ids y agregué una verificación de usuario a los métodos ...

@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.')
La cuestión

usuario actual es siempreNinguna entonces el método siempre generará una excepción. Parece que este es un problema conocidoProblema 8848: Google Cloud Enpoints get_current_user API no llena user_id (3) sin perspectivas de una solución pronto.

Opciones?Espere hasta que google solucione el Problema 8848. Realmente no puedo, ¡tenemos un producto para lanzar!

EDITAR: 15 de mayo de 2015 - Google hizo el estado de Issue 8848 WontFix.

Vi que puede ser posible usar una clave API, pero aunque he podido crear una, no he encontrado una manera de habilitarla en el backend. También noto que este método tiene un gran agujero donde el Explorador de API de Google puede vencerlover pregunta SO (4)

Hace el@ endpoints.api Argumento: auth_level, descrito aquí (5), proporcionar una respuesta? Intenté usar:

@endpoints.api(name='demogaeapi', version='v1',
       auth_level=endpoints.AUTH_LEVEL.REQUIRED,
       scopes=[endpoints.EMAIL_SCOPE],
       description='My Demo API')

Pero pude usar la API desde la aplicación cliente sin usar credenciales. Por lo tanto, claramente no agregó ninguna autenticación.

Agregue una propiedad oculta a la consulta del cliente con una clave secreta compartida. Según lo descrito por bossylobsteraquí (6) y Carlosaquí (7) Intenté esto pero no puedo ver cómo llegar al crudosolicitud objeto (sujeto de otra pregunta¿Cómo llegar al objeto de solicitud cuando se usan endpoints_proto_datastore.ndb?)

@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!')

EDITAR: Ha surgido otra opción:

Cree una cuenta de servicio utilizando elConsola de desarrolladores de Google (2) Use esta cuenta para obtener acceso a la API sin la necesidad del consentimiento del usuario (a través de la interfaz de usuario). Sin embargo, Google parece limitar la cantidad de aplicaciones que se pueden agregar de esta manera a 15 o 20. Ver Google OAuth2 doc (8). Probablemente superaremos el límite.La pregunta

¿Alguien sabe cómo puedo hacer que cualquiera de estas opciones funcione? ¿O debería abordar esto de una manera diferente?

Como puede ver, necesito orientación, ayuda, ideas ...

Como necesito 10 reputación para publicar más de 2 enlaces: aquí están los enlaces que tuve que extraer y agregar como referencias. Algo así arruinó el flujo de la pregunta realmente.

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta