Pregunta

Estoy tratando de usar el Google Drive API a través de la Aplicación De La Identidad interfaz proporcionada con Google App Engine.Básicamente, esto permite que mi aplicación web para comunicarse con Google Api de servidor a servidor.

No necesito que mis usuarios de inicio de sesión, simplemente tengo la necesidad de mostrar mis propios documentos de Google Drive.

Sin embargo, después de ajustar todos los valores apropiados y ámbitos, y permitir a todos el derecho de Google de la Unidad de mandos en la página de la consola, todavía me pongo esto por una simple petición GET a https://www.googleapis.com/drive/v2/files:

{ "error": { "errors": [ { "domain": "usageLimits", "reason": "dailyLimitExceededUnreg", "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.", "extendedHelp": "https://code.google.com/apis/console" } ], "code": 403, "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup." }}

Qué tiene de malo?Lo que me estoy perdiendo?Aquí está el código que realmente hace la petición - lo curioso es que funciona muy bien si uso otras APIs como el acortador de URL de la API:

var scopes = new java.util.ArrayList();                                                                                                    
scopes.add("https://www.googleapis.com/auth/drive");                                                                                       
var appIdentity = AppIdentityServiceFactory.getAppIdentityService();                                                                       
var accessToken = appIdentity.getAccessToken(scopes);

var url = new URL("https://www.googleapis.com/drive/v2/files");                                                                            
var connection = url.openConnection();                                                                                                     
connection.setDoOutput(true);                                                                                                              
connection.setRequestMethod("GET");                                                                                                        
connection.addRequestProperty("Content-Type", "application/json");                                                                         
connection.addRequestProperty("Authorization", "OAuth " + accessToken.getAccessToken());

EDITAR

Si yo simplemente cambiar el API para utilizar el urlshortner API por ejemplo, funciona:

var url = new URL("https://www.googleapis.com/urlshortener/v1/url/history");

Y de salida:

{ "kind": "urlshortener#urlHistory", "totalItems": 0, "itemsPerPage": 30}

Así que debe haber algo que no está trabajando con Google Drive y Aplicación de la Identidad?

EDIT 2

He encontrado algo de ayuda de la respuesta correcta aquí: https://stackoverflow.com/a/12526286/50394

Pero se trata de hablar acerca de la configuración de la API de Cliente de los ámbitos en Google Apps, y no lo estoy usando Google Apps, simplemente estoy utilizando Google App Engine del dominio foo.appspot.com

¿Fue útil?

Solución

El error 403 usted está recibiendo significa que no había encabezado de Autorización en su CONSEGUIR.La lógica es que sin un encabezado de Autorización, que son anónimas (que son legión, bla, bla :-)).La Unidad de la cuota para el uso anónimo es cero, por lo tanto el mensaje.El acortador de URL tiene una cuota mayor para los anónimos, a fin de que funciona.

Sugiero cambiar la dirección URL para que apunte a un servidor http de su propia, y comprobar lo que se encabezados de que son en realidad el envío.

Otros consejos

AFAICT usted debe utilizar Bearer en el encabezado de Autorización.

Probablemente lo que sucede es que, la Unidad de la API no reconoce la cuenta de servicio (debido a el mal de cabecera?) y así tomarlo como una solicitud anónima ya que no key parámetro no proporcionada (ver común de consulta de parámetros).

Intente esto:

connection.addRequestProperty("Authorization", "Bearer " + accessToken.getAccessToken());

O usted puede tratar de añadir el token como access_token consulta param.

Creo que se debe, al menos, la instalación de una API de la consola con la entrada de la Unidad de la API habilitado en https://code.google.com/apis/console Una vez creado este recibirá un ID que puede utilizar en su GoogleCredential objeto.Desde el GoogleCredential objeto puede obtener el token de acceso que usted puede agregar a su solicitud.

Lo que he leído aquí (Google drive a través de las cuentas de servicio) fue que el uso de un estilo un poco diferente que utiliza una CLAVE de API que recuperar de la Consola para Desarrolladores.
Las partes pertinentes para mí fue la generación de una "Clave para el Servidor de Aplicaciones", a continuación, utilizar esta técnica, que yo no había leído en cualquier otro lugar!

      HttpTransport httpTransport = new NetHttpTransport();
  JsonFactory jsonFactory = new JacksonFactory();
  AppIdentityCredential credential =
      new AppIdentityCredential.Builder(DriveScopes.DRIVE).build();
  // API_KEY is from the Google Console as a server API key
  GoogleClientRequestInitializer keyInitializer =
      new CommonGoogleClientRequestInitializer(API_KEY);
  Drive service = new Drive.Builder(httpTransport, jsonFactory, null)
      .setHttpRequestInitializer(credential)
      .setGoogleClientRequestInitializer(keyInitializer)
      .build();

Este respuesta afirma que:

Cuentas de servicio que no son soportadas por la Unidad SDK debido a su modelo de seguridad.

Si eso sigue siendo cierto, una solución es realizar un regular OAuth de baile de una vez con la Cuenta de Google, y de persistir el acceso y la actualización de token en el almacén de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top