AppEngine – API remota que devuelve 401 y demasiada autenticación

Estoy tratando de conectarme a una instancia de AppEngine con la API remota con algo como esto:

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = ".../path/to/key" remote_api_stub.ConfigureRemoteApiForOAuth( server.encode('ascii'), path, secure=True ) 

Donde la path/to/key apunta a un archivo JSON creado en Google Cloud (Beta), Administrador de API -> Credenciales -> Agregar credenciales -> Cuenta de servicio . La cuenta de servicio “Se puede editar” según el panel Permisos .

Cuando ejecuto esto, aparece un error como este en la consola, que corresponde a un 401 (según se informa en el visor de registro de App Engine):

   Archivo "/usr/local/share/app-engine-python/google/appengine/ext/remote_api/remote_api_stub.py", línea 768, en ConfigureRemoteApiForOAuth
     rpc_server_factory = rpc_server_factory)
   Archivo "/usr/local/share/app-engine-python/google/appengine/ext/remote_api/remote_api_stub.py", línea 835, en ConfigureRemoteApi
     app_id = GetRemoteAppIdFromServer (servidor, ruta, rtok)
   Archivo "/usr/local/share/app-engine-python/google/appengine/ext/remote_api/remote_api_stub.py", línea 569, en GetRemoteAppIdFromServer
     response = server.Send (ruta, carga útil = Ninguna, ** urlargs)
   Archivo "/usr/local/share/app-engine-python/google/appengine/tools/appengine_rpc_httplib2.py", línea 258, en Enviar
     NeedAuth ()
   Archivo "/usr/local/share/app-engine-python/google/appengine/tools/appengine_rpc_httplib2.py", línea 234, en NeedAuth
     RaiseHttpError (url, response_info, response, 'Demasiados bashs de autenticación')
   Archivo "/usr/local/share/app-engine-python/google/appengine/tools/appengine_rpc_httplib2.py", línea 85, en RaiseHttpError
     elevar urllib2.HTTPError (url, response_info.status, msg, response_info, flujo)
 urllib2.HTTPError: HTTP Error 401: no autorizado Demasiados bashs de autenticación.

Lo verifiqué y las credenciales correctas parecen estar configuradas en /google/appengine/ext/remote_api/remote_api_stub.py:760 y deberían pasarse a la API remota.

La app.yaml tiene la configuración básica - remote_api: on under builtins .

    Esta configuración funciona para el dev_appserver.py local, así que creo que el problema está en la configuración del servidor / nube de Google.

    He probado ambos esquemas de autenticación en App Engine -> Configuración -> Configuración de la aplicación (API de Google Accounts y dominio de Google Apps).

    Seguí las credenciales predeterminadas de la aplicación de Google tan bien como pude, pero ¿tal vez me perdí algo?

    Probablemente también vale la pena señalar que desde la línea de comandos:

     $ GOOGLE_APPLICATION_CREDENTIALS=~/path-to-key remote_api_shell.py -s APPID.appspot.com --secure APPID 

    También da la misma excepción 401.

    Ok, entonces lo que parecía ser necesario era:

    1. Vaya a la página de administración de appspot.com.
    2. En Configuración de la aplicación, habilite la integración en la nube
    3. Cree una nueva cuenta de servicio en el nuevo Administrador de API de la página de la consola en la nube (las cuentas de servicio existentes no parecen funcionar)
    4. Cambie a remote_api_stub.ConfigureRemoteApiFromServer : en una inspección adicional, parece que ConfigureRemoteApiForOAuth funciona bien.

    Al menos después de realizar el acceso anterior funciona como se espera.

    Espero que otros en una situación similar encuentren esto útil.

    Editar Esto puede estar relacionado con el problema tratado en este hilo: https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/google-cloud-insiders/ohnp1XAOdiM/KrQF8_DAAAAJ

    Para las personas que usan la API remota desde la línea de comandos ( bulkloader.py , bulkloader.py , etc.), también puede ocurrir un error 401 si las cookies de su appengine caducan.

    Intenta eliminarlos y autenticar de nuevo:

    rm ~/.appcfg* gcloud auth login

    Esto podría suceder en los casos en que los cambios realizados en una cuenta de Google obligan a cerrar la sesión (por ejemplo, habilitar la autenticación de 2 factores).