Pergunta

Estou tentando usar o Google Drive através da API Aplicativo De Identidade interface fornecida com o Google App Engine.Este, basicamente, permite que o meu aplicativo da web para se comunicar com o Google APIs do de servidor para servidor.

Eu não preciso do meu blog para fazer o login, eu simplesmente precisa mostrar meus próprios documentos do Google Drive.

No entanto, depois de definir todos os valores apropriados e escopos, e permitir a todos o direito Google Unidade de botões na consola de página, eu ainda recebo isso por um simples pedido para OBTER 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." }}

O que há de errado?O que eu estou ausente?Aqui está o código que realmente faz a solicitação engraçado é que ele funciona muito bem, se eu usar outras APIs, tais como o URL shortener 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

Se eu simplesmente alterar a API para usar o urlshortner API por exemplo, ele funciona:

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

E de saída:

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

Portanto, deve haver algo que não trabalham com o Google Drive e o Aplicativo de Identidade?

EDIT 2

Eu encontrei um pouco de ajuda da a resposta correta aqui: https://stackoverflow.com/a/12526286/50394

Mas falando sobre a configuração de Cliente escopos da API do Google Apps, e eu não estou usando o Google Apps, estou simplesmente usando o Google App Engine do domínio foo.appspot.com

Foi útil?

Solução

O erro 403 você está recebendo significa que não havia nenhum cabeçalho de Autorização em seu CHEGAR.A lógica é que, sem um cabeçalho de Autorização, são anónimos (que são legião, blá, blá :-)).A Unidade de cota para anônimo uso é zero, portanto a mensagem.URL shortener tem uma cota maior para ser anônimo para que ele funciona.

Eu sugiro que você altere o URL para apontar para um servidor de http de seu próprio, e verifique se que os cabeçalhos na verdade, você está enviando.

Outras dicas

AFAICT você deve estar usando Bearer no cabeçalho de Autorização.

Provavelmente o que está acontecendo é que, a Unidade de API de não reconhecer a conta de serviço (por causa do cabeçalho errado?) e, assim, tomando-a como um anônimo pedido uma vez que não key parâmetro não foi fornecido (ver comum de consulta de parâmetros).

Tente isso:

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

Ou você pode tentar adicionar o token como access_token consulta param.

Eu acho que você deve, no mínimo, a instalação de uma API de entrada do console com Drive API habilitado no https://code.google.com/apis/console Depois de criar isso, você receberá um ID que você pode usar em seu GoogleCredential objeto.A partir do GoogleCredential objeto que você pode obter o token de acesso que você pode adicionar à sua solicitação.

O que eu li aqui (O Google drive através de contas de serviço) foi que você use um estilo um pouco diferente que usa uma CHAVE de API que você recuperar a partir do Console do Desenvolvedor.
Os trechos pertinentes para mim foram para gerar uma "Chave para o Servidor de Aplicativos" e, em seguida, usar essa técnica, que eu não tinha lido em qualquer outro 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 responder afirma que:

Contas de serviço não são suportados pela Unidade do SDK, devido à sua modelo de segurança.

Se isso ainda é verdadeiro, uma solução alternativa é a realização de um regular OAuth de dança uma vez com uma regulares Conta do Google, e manter o acesso e atualização de token no armazenamento de dados.

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