Google Drive / OAuth - Não consigo descobrir como obter GoogleCredentials reutilizáveis

Eu instalei e executei com sucesso oAplicativo de início rápido do Google Drive chamado DriveCommandLine. Também o adaptei um pouco para obter informações de arquivo para um dos arquivos da minha conta do Google Drive.

O que eu gostaria de fazer agora é salvar as credenciais de alguma forma e reutilizá-las sem que o usuário tenha que visitar uma página da web a cada vez para obter um código de autorização. Eu verifiqueiesta página com instruções para Recuperar e usar credenciais do OAuth 2.0. Para usar a classe de exemplo (MyClass), modifiquei a linha no DriveCommandLine onde o objeto Credential é instanciado:

Credential credential = MyClass.getCredentials(code, "");

Isso resulta na seguinte exceção sendo lançada:

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)

Estou vendo essas APIs (Google Drive e OAuth) há dois dias e tenho feito muito pouco progresso. Eu realmente aprecio alguma ajuda com o erro acima e o problema de obter credenciais persistentes em geral.

Toda essa estrutura parece desnecessariamente complicada para mim. Alguém se importa em explicar por que não posso simplesmente criar um objeto Credential simples passando meu nome de usuário e senha do Google?

Obrigado, Brian O Carroll, Dublin, Irlanda

* Atualização *

Ok, acabei de resolver o erro acima e agora tenho um novo.

A maneira como resolvi o primeiro problema foi modificando MyClass.getFlow (). Em vez de criar um objeto GoogleClientServices a partir de um arquivo json, usei uma versão diferente do GoogleAuthorizationCodeFlow.Builder que permite inserir o ID do cliente e o segredo do cliente diretamente como Strings:

flow = new GoogleAuthorizationCodeFlow.Builder(httpTransport, jsonFactory, "<MY CLIENT ID>", "<MY CLIENT SECRET>", SCOPES).setAccessType("offline").setApprovalPrompt("force").build();

O problema que tenho agora é que recebo o seguinte erro quando tento usar o fluxo (objeto GoogleAuthorizationCodeFlow) para trocar o código de autorização do objeto Credentials:

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)

Existe algum outro escopo que eu deveria estar usando para isso? Atualmente estou usando a matriz de escopos fornecida com 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");

Obrigado!

questionAnswers(3)

yourAnswerToTheQuestion