O Google Drive API através do Google App Engine
-
12-12-2019 - |
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
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.