Pergunta

Eu gostaria de representar um usuário e adicionar arquivos para os usuários do Google Drive em seu nome a partir de um processo de servidor.Eu configuração de uma conta de serviço e pode acessar com êxito a Unidade como a conta de serviço a adição e a listagem de arquivos, etc.usando o seguinte código:

  /** Global instance of the HTTP transport. */
  private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  /** Global instance of the JSON factory. */
  private static final JsonFactory JSON_FACTORY = new JacksonFactory();

  public static void main(String[] args) {
    try {
        GoogleCredential credential = 
                new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                  .setJsonFactory(JSON_FACTORY)
                  .setServiceAccountId("XXXXX@developer.gserviceaccount.com")
                  .setServiceAccountScopes(DriveScopes.DRIVE)
                  .setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12"))
                  .build();
        Drive drive = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).build();         
        drive.files().list().execute();
  } catch (Exception e) {
     e.printStackTrace();
  }

Isso funciona, no entanto, retorna apenas os ficheiros que estão associados ao que eu suponho que é associado com as contas de serviço da unidade (?).

De acordo com o JavaDoc, GoogleCredential também pode ser usado para representar um usuário adicionando a conta de serviço endereço de email de usuários, como segue:

        GoogleCredential credential = 
                new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
                  .setJsonFactory(JSON_FACTORY)
                  .setServiceAccountId("XXXXX@developer.gserviceaccount.com")
                  .setServiceAccountScopes(DriveScopes.DRIVE)
                  .setServiceAccountPrivateKeyFromP12File(new File("c:/junk/key.p12"))
                  .setServiceAccountUser("usera@domain.com") //<-- impersonate user a
                  .build();

No entanto, quando executar este código, a seguinte excepção:

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "access_denied"
}
at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:103)
at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:303)
at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:323)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:340)
at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:508)
at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:260)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:796)
at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:198)
at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:237)
at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:207)
at com.google.api.services.drive.Drive$Files$List.execute(Drive.java:1071)

Estou faltando uma etapa de configuração ou definição?

Obrigado, David

Foi útil?

Solução

Achei uma pergunta semelhante, como o meu: Pode um Administrador do Google Apps gerenciar arquivos de usuários com a Unidade SDK? a minha, que me ajudou a descobrir a resposta.

O cPanel documentação é um pouco enganador, pois ele se refere a permitir ao consumidor chave e, em seguida, adicionar o domínio para Gerenciar API de acesso para cliente do ecrã.Este parece ser válida para o gdata api, e não a nova api do Google Drive.Adicionando o id de cliente, como sugerido na outra pergunta e a concessão de acesso à Unidade de escopo que eu sou agora capaz de representar um usuário.

Outras dicas

Obter a sua administração para adicionar escopos para xxxxx.apps.googleusercontent.com através do painel de administração:

Eu adicionei o seguinte para trabalhar em planilhas:


https://www.googleapis.com/auth/drive
https://docs.google.com/feeds
https://spreadsheets.google.com/feeds

delegate oAuth permissions scope

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top