He instalado y ejecuto con éxito el Google Drive Quick Start application called DriveCommandLine. También lo he adaptado un poco para OBTENER información de archivo para uno de los archivos en mi cuenta de Drive.Google Drive/OAuth: no se puede encontrar la forma de obtener GoogleCredentials reutilizables
Lo que me gustaría hacer ahora es guardar las credenciales de alguna manera y volver a utilizarlas sin que el usuario tenga que visitar una página web cada vez para obtener un código de autorización. He revisado this page con instrucciones para Recuperar y Usar credenciales de OAuth 2.0. Con el fin de utilizar la clase de ejemplo (MyClass), he modificado la línea en DriveCommandLine donde se crea una instancia del objeto de credenciales:
Credential credential = MyClass.getCredentials(code, "");
Esto se traduce en la siguiente excepción ser arrojado:
java.lang.NullPointerException
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:187)
at com.google.api.client.json.jackson.JacksonFactory.createJsonParser(JacksonFactory.java:84)
at com.google.api.client.json.JsonFactory.fromInputStream(JsonFactory.java:247)
at com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.load(GoogleClientSecrets.java:168)
at googledrive.MyClass.getFlow(MyClass.java:145)
at googledrive.MyClass.exchangeCode(MyClass.java:166)
at googledrive.MyClass.getCredentials(MyClass.java:239)
at googledrive.DriveCommandLine.<init>(DriveCommandLine.java:56)
at googledrive.DriveCommandLine.main(DriveCommandLine.java:115)
I' He estado mirando estas API (Google Drive y OAuth) durante 2 días y he progresado muy poco. Realmente agradecería algo de ayuda con el error anterior y el problema de obtener credenciales persistentes en general.
Toda esta estructura me parece innecesariamente complicada. ¿A alguien le importa explicar por qué no puedo simplemente crear un objeto credencial simple al pasar mi nombre de usuario y contraseña de Google?
Gracias, Brian O Carroll, Dublín, Irlanda
* Actualización *
Ok, he llegado sólo alrededor del error anterior y ahora tengo una nueva.
La forma en que solucioné el primer problema fue modificando MyClass.getFlow(). En lugar de crear un objeto GoogleClientServices de un archivo JSON, he utilizado una versión diferente de GoogleAuthorizationCodeFlow.Builder que le permite introducir el ID de cliente y el cliente secreta directamente como Strings:
flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, jsonFactory, "<MY CLIENT ID>", "<MY CLIENT SECRET>", SCOPES).setAccessType("offline").setApprovalPrompt("force").build();
El problema que tengo ahora es que me sale el siguiente error al intentar utilizar el flujo (GoogleAuthorizationCodeFlow objeto) para cambiar el código de autorización para las credenciales objeto:
An error occurred: com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
"error" : "invalid_scope"
}
googledrive.MyClass$CodeExchangeException
at googledrive.MyClass.exchangeCode(MyClass.java:185)
at googledrive.MyClass.getCredentials(MyClass.java:262)
at googledrive.DriveCommandLine.<init>(DriveCommandLine.java:56)
at googledrive.DriveCommandLine.main(DriveCommandLine.java:115)
¿hay algún otro ámbito que debería usar para esto? Actualmente estoy usando la matriz de ámbitos proporcionada con MyClass:
private static final List<String> SCOPES = Arrays.asList(
"https://www.googleapis.com/auth/drive.file",
"https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/userinfo.profile");
Gracias!
Gracias pinoyyid, lo siento, accidentalmente añadió una edición/actualización de su puesto en lugar de la mía. ¡Todavía me estoy acostumbrando a publicar aquí! Intentaré implementar sus sugerencias y le dejaré saber cómo va eso. PD: Desafortunadamente, no tengo 2 meses para trabajar en esto. ¡Estoy molesto porque ya he pasado 2 días! : -/ –
Con respecto al retorno de frefreshtoken. Creé una aplicación de servidor que debe ejecutarse sin interacción del usuario después de configurada.Pero hace algunos días (estuvo funcionando durante 2 meses sin problemas) se vio que se abrieron varias páginas de Auth en el servidor para solicitar acceso a la aplicación para usar Google Drive. Incluso si estaba pidiendo Auth, aún funcionaba. ¿Alguna pista de por qué ocurre esto? –
probablemente sea una pregunta separada. También veo esto y lo atribuyo a Google que expira aleatoriamente el token de actualización. Compruebe si hay una subvención de 400 inválidos en sus registros para ver si esa es la causa. ¿Es posible que su aplicación solicite un token de actualización desde más de un lugar? Creo que si ese es el caso, los nuevos tokens de actualización pueden caducar los antiguos. – pinoyyid